1.2 een snelle blik
voordat we te diep in de details gaan, demonstreer ik eerst een eenvoudig voorbeeld met behulp van basisfunctionaliteiten in circlize package om u te helpen een basisidee te krijgen van hoe het pakket werkt.
laten we eerst wat willekeurige gegevens genereren. Er is een tekenvector nodig om Categorieën voor te stellen, een numerieke vector van x-waarden en een vectoe van y-waarden.
set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))
eerst initialiseren we de cirkelvormige lay-out. De cirkel is opgesplitst in sectoren op basis van het gegevensbereik op x-assen in elke categorie. In de volgende code wordt df$x
gesplitst door df$sectors
en wordt de breedte van sectoren automatisch berekend op basis van gegevensbereiken in elke categorie. Standaard worden sectoren gepositionedstarted from \(\theta = 0\) (in het polaire coördinatenstelsel) en ga langs het cirkelslot-wijselijk. U kunt niets zien na het uitvoeren van de volgende code, omdat notrack is toegevoegd nog.
library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)
we stellen een globale parameter track.height
in op 0.1 door de optiefunctiecircis.par()
zodat alle tracks die worden toegevoegd een standaardhoogte hebben van0. 1. De cirkel die door circlize wordt gebruikt heeft altijd een straal van 1, dus een hoogte van0.1 betekent 10% van de straal van de cirkel. In latere hoofdstukken kunt u de hoogte instellen met fysieke eenheden, bijvoorbeeld cm.
merk op dat Voor de allocatie van sectoren alleen waarden op X-richting nodig zijn (of op de cirkelrichting), de waarden op y-richting (radicale richting) zullen worden gebruikt bij het maken van tracks.
nadat de circulaire lay-out is geïnitialiseerd, kunnen afbeeldingen worden toegevoegd aan de plot op een track-by-track manier. Voordat we iets tekenen, moeten we weten dat alltracks eerst gemaakt moeten worden door circos.trackPlotRegion()
of, kort gezegd,circos.track()
, daarna kunnen de low-level functies toegevoegd worden. Denk er maar aan dat je in de basis R grafische engine eerst plot()
moet aanroepen, dan kun je functies zoals points()
en lines()
gebruiken om afbeeldingen toe te voegen. Aangezien x-Ranges voor cellen in de track al zijn gedefinieerd in de initialisatiestap,hoeven we hier alleen het y-bereik voor elke cel op te geven. De Y-bereiken kunnen worden gespecificeerd door y
argument als een numerieke vector (zodat y-bereik wordt beautomatisch geëxtraheerd en berekend in elke cel) of ylim
argument als avector van lengte twee. In principe moeten y-bereiken hetzelfde zijn voor alle cellen in een zelfde spoor. (Zie figuur 1.2)
circos.track(df$sectors, y = df$y, panel.fun = function(x, y) { circos.text(CELL_META$xcenter, CELL_META$cell.ylim + mm_y(5), CELL_META$sector.index) circos.axis(labels.cex = 0.6)})col = rep(c("#FF0000", "#00FF00"), 4)circos.trackPoints(df$sectors, df$x, df$y, col = col, pch = 16, cex = 0.5)circos.text(-1, 0.5, "text", sector.index = "a", track.index = 1)
figuur 1.2: eerste voorbeeld van circlize, voeg de eerste track toe.
assen voor de cirkelvormige plot worden gewoonlijk op de meest buiten de cirkel getekend. Hier voegen we Assen toe in de eerste track door circos.axis()
in de zelf gedefinieerde functie panel.fun
te plaatsen (zie de code hierboven). circos.track()
creëert een plotgebied op een cel-voor-cel manier en panel.fun
wordt feitelijk uitgevoerd onmiddellijk nadat het plotgebied voor een bepaalde cel is aangemaakt. panel.fun
betekent dus eigenlijk het toevoegen van afbeeldingen in de “currentcell” (gebruik van panel.fun
wordt verder besproken in Paragraaf 2.7).Zonder argumenten op te geven, tekent circos.axis()
x-axeson de bovenkant van elke cel (of de buitenkant van elke cel).
ook voegen we sectornaam toe buiten de eerste track door circos.text()
te gebruiken.CELL_META
geeft “meta-informatie” voor de huidige cel. Er zijn verschillende parameters die met CELL_META
kunnen worden opgehaald. Al het gebruik ervan wordt uiteengezet in Paragraaf 2.7. In bovenstaande code worden de sectornamen buiten de cellen getekend en kunt u waarschuwingsberichten zien met gegevenspunten die de plotteregio ‘ s overschrijden. Dat is helemaal prima en geen zorgen over. U kunt ook sectornamen toevoegen door als eerste track een lege track zonder randen aan te maken en er sectornamen in toe te voegen (zoalscircos.initializeWithIdeogram()
en chordDiagram()
, nadat u de volgende hoofdstukken hebt doorlopen).
bij het specificeren van de positie van de tekst op de y-richting wordt een offset vanmm_y(5)
(5mm) toegevoegd aan de y-positie van de tekst. In circos.text()
worden x en ywaarden gemeten in de gegevenscoördinaat (de coördinaat in cel), en er zijn enkele helperfuncties die absolute eenheden converteren naar overeenkomstige waarden in de gegevenscoördinaat. Paragraaf2. 8.2 biedt meer informatie over het converteren van eenheden onverschillige coördinaten.
nadat de track is aangemaakt, worden punten toegevoegd aan de eerste track metcircos.trackPoints()
. circos.trackPoints()
voegt simultaan punten in alle cellen toe. Zoals nader toegelicht in punt 3.2, kan het worden geplaatst door circos.text()
in panel.fun
te zetten, echter,circos.trackPoints()
zou handiger zijn als alleen de punten nodig zijn om in de cellen te zetten (maar ik raad het niet echt aan). Het is vrij eenvoudig om te begrijpen dat deze functie een categorische variabele (df$sectors
), waarden op X-richting en y-richting (df$x
en df$y
) nodig heeft.
Low-level functies zoals circos.text()
kunnen ook buitenpanel.fun
worden gebruikt, zoals weergegeven in bovenstaande code. Als dat zo is, moeten sector.index
en track.index
expliciet worden opgegeven omdat de “current” sector en “current”track mogelijk niet zijn wat u wilt. Als de graphics direct worden toegevoegd aan de track die het laatst is aangemaakt, kan track.index
worden ommitted omdat deze track is gemarkeerd als de “current” track.
OK, nu voegen we histogrammen toe aan het tweede spoor. Hier is circos.trackHist()
een functie op hoog niveau, wat betekent dat het een nieuwe track aanmaakt (zoals je kunt zien is hist()
ook een functie op hoog niveau). bin.size
is expliciet zo ingesteld dat de binsize voor histogrammen in alle cellen hetzelfde is en met elkaar vergeleken kan worden. (Zie figuur 1.3)
bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
figuur 1.3: Eerste voorbeeld van circlize, voeg de tweede track.
in het derde spoor en in panel.fun
hebben we willekeurig 10 gegevenspunten in elke cel geselecteerd, sorteren ze op x-waarden en verbinden ze met lijnen. In de volgende code, wanneer sectors
(het eerste naamloze argument), x
eny
argumenten zijn ingesteld in circos.track()
, worden x-waarden en y-waarden gesplitst door df$sectors
en worden de overeenkomstige deelverzamelingen van x-en y-waarden naarpanel.fun
verzonden via panel.fun
’s x
en y
argumenten. x
en y
in panel.fun
zijn dus feitelijk de waarden in de” huidige ” cel. (Zie Figuur 1.4)
circos.track(df$sectors, x = df$x, y = df$y, panel.fun = function(x, y) { ind = sample(length(x), 10) x2 = x y2 = y od = order(x2) circos.lines(x2, y2)})
figuur 1.4: eerste voorbeeld van circlize, voeg het derde spoor toe.
nu gaan we terug naar het tweede spoor en werken de cel bij in sector “d”.Dit wordt gedaan door circos.updatePlotRegion()
of de korte versiecircos.update()
. De functie wist afbeeldingen die zijn toegevoegd.circos.update()
kan de xlim
en ylim
van de cel en andere instellingen met betrekking tot de positie van de cel niet wijzigen. circos.update()
moet expliciet de sector index en track index specificeren, tenzij de”huidige” cel is wat u wilt bijwerken. Na het aanroepen van circos.update()
wordt de” huidige ” cel omgeleid naar de cel die u zojuist hebt opgegeven en kunt u grafische functies op laag niveau gebruiken om er afbeeldingen direct in toe te voegen.(Zie figuur 1.5)
circos.update(sector.index = "d", track.index = 2, bg.col = "#FF8080", bg.border = "black")circos.points(x = -2:2, y = rep(0.5, 5), col = "white")circos.text(CELL_META$xcenter, CELL_META$ycenter, "updated", col = "white")
figuur 1.5: eerste voorbeeld van circlize, bijwerken van het tweede spoor.
vervolgens gaan we verder met het maken van nieuwe tracks. Hoewel we terug zijn gegaan naar de tweede track, wordt bij het maken van een nieuwe track de nieuwe track nog steeds gemaakt na de track die het meest binnen is. In deze nieuwe track voegen we heatmaps toe metcircos.rect()
. Merk op dat we de invoergegevens niet hebben ingesteld, terwijl we gewoon hetylim
– argument instellen omdat heatmaps gewoon de hele cel vullen van links naar rechts en van onder naar boven. Ook de exacte waarde van ylim
is niet belangrijk en x
, y
in panel.fun()
worden niet gebruikt (in feite zijn ze beideNULL
). (Zie figuur 1.6)
circos.track(ylim = c(0, 1), panel.fun = function(x, y) { xlim = CELL_META$xlim ylim = CELL_META$ylim breaks = seq(xlim, xlim, by = 0.1) n_breaks = length(breaks) circos.rect(breaks, rep(ylim, n_breaks - 1), breaks, rep(ylim, n_breaks - 1), col = rand_color(n_breaks), border = NA)})
figuur 1.6: eerste voorbeeld van circlize, voeg het vierde spoor toe.
aan de binnenkant van de cirkel worden links of linten toegevoegd. Er kunnen links zijn van enkel punt naar punt, punt naar interval of interval naar interval. Paragraaf 3.11 geeft een gedetailleerd gebruik van links. (Zie figuur 1.7)
circos.link("a", 0, "b", 0, h = 0.4)circos.link("c", c(-0.5, 0.5), "d", c(-0.5,0.5), col = "red", border = "blue", h = 0.2)circos.link("e", 0, "g", c(-1,1), col = "green", border = "black", lwd = 2, lty = 2)
figuur 1.7: eerste voorbeeld van circlize, koppelingen toevoegen.
ten slotte moeten we de grafische parameters en interne variabelen resetten, zodat het uw volgende plot niet zal verpesten.
circos.clear()