cirkulär visualisering i R

1.2 en snabb blick

innan vi går för djupt in i detaljerna visar jag först ett enkelt exempelmed hjälp av grundläggande funktioner i circlize-paketet för att hjälpa dig att få en grundläggande uppfattning om hur paketet fungerar.

låt oss först generera några slumpmässiga data. Det behöver en teckenvektor tillrepresentera kategorier, en numerisk vektor av X-värden och en vectoe av y-värden.

set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))

först initierar vi den cirkulära layouten. Cirkeln är uppdelad i sektorerbaserat på dataområdet på x-axlar i varje kategori. I följande kod delas df$xmed df$sectors och bredden på sektorer beräknas automatiskt baserat på dataområden i varje kategori. Vara standard, sektorer är positioneradebörjade från \(\theta = 0\) (i polarkoordinatsystemet) och gå längs circleclock-klokt. Du kanske inte ser något efter att ha kört följande kod eftersom notrack har lagts till ännu.

library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)

vi ställer in en global parameter track.height till 0.1 med alternativfunktionencircis.par() så att alla spår som kommer att läggas till har en standardhöjd på0. 1. Cirkeln som används av circlize har alltid en radie av 1, Så en höjd AV0, 1 betyder 10% av cirkelns radie. I senare kapitel kan du hitta hur du ställer inhöjd med fysiska enheter, t.ex.

Observera att fördelningen av sektorer endast behöver värden på X-riktningen (elleri cirkulär riktning) kommer värdena på y-riktningen (radikal riktning) att användasi steget att skapa spår.

när den cirkulära layouten har initierats kan grafik läggas till i diagrammet på ett spår-för-spår-sätt. Innan vi ritar något måste vi veta att alltspår bör först skapas av circos.trackPlotRegion() eller, för kort,circos.track(), då kan lågnivåfunktionerna läggas till efteråt. Justthink i bas r grafisk motor, du behöver först ringa plot() då kan duanvänd funktioner som points() och lines() för att lägga till grafik. Eftersom x-intervallför celler i spåret redan har definierats i initialiseringssteget,behöver vi bara ange y-intervallet för varje cell. Y-intervallen kan specificeras med y argument som en numerisk vektor (så att y-intervallet kommer beautomatically extraheras och beräknas i varje cell) eller ylim argument som avector av längd två. I princip bör y-intervall vara samma för alla celler i asame spår. (Se figur 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)

första exemplet på circlize, lägga till det första spåret.

figur 1.2: första exemplet på circlize, lägga till det första spåret.

axlar för den cirkulära tomten ritas normalt på den mest utsidan av cirkeln. Här lägger vi till axlar i det första spåret genom att sätta circos.axis() insideden självdefinierade funktionen panel.fun (se koden ovan). circos.track()skapar plottningsregion på ett cell-för-cell-sätt och panel.fun exekveras faktiskt omedelbart efter att plottningsregionen för en viss cell har skapats. Således betyder panel.fun faktiskt att lägga till grafik i” currentcell ” (användning av panel.fun diskuteras vidare i avsnitt 2.7).Utan att ange några argument drar circos.axis() x-axlarpå toppen av varje cell (eller utsidan av varje cell).

dessutom lägger vi till sektornamn utanför det första spåret genom att använda circos.text().CELL_META ger ”metainformation” för den aktuella cellen. Det finns flera parametrar som kan hämtas med CELL_META. All dess användning förklaras i avsnitt 2.7. I ovanstående kod dras sektornamnen utanför cellerna och du kan se varningsmeddelanden som säger datapunkteröverstiger de plottande regionerna. Det är helt bra och oroa dig inte för det. Du kan också lägga till sektornamn genom att skapa ett tomt spår utan gränser som det första spåret och lägga till sektornamn i det (som vadcircos.initializeWithIdeogram() och chordDiagram() gör, efter att du har gått igenomföljande kapitel).

när du anger textens position i Y-riktningen läggs en förskjutning påmm_y(5) (5 mm) till Y-positionen i texten. I circos.text() mäts x-och Y-värden i datakoordinaten (koordinaten i cellen), och det finns några hjälpfunktioner som konverterar absoluta enheter till motsvarande värdei datakoordinat. Avsnitt 2. 8.2 ger mer information om att konvertera enheter likgiltiga koordinater.

när spåret har skapats läggs poäng till det första spåret medcircos.trackPoints(). circos.trackPoints() lägger helt enkelt till punkter i alla cellersamtidigt. Som förklaras närmare i avsnitt 3.2, Det kan ersättas genom att sätta circos.text() i panel.fun, mencircos.trackPoints() skulle vara bekvämare om bara punkterna behövs för att sätta i cellerna (men jag rekommenderar inte riktigt). Det är ganska enkelt att förstå att dettafunktionen behöver en kategorisk variabel (df$sectors), värden på X-riktningoch Y-riktning (df$x och df$y).

lågnivåfunktioner somcircos.text() kan också användas utanför panel.fun som visas i ovanstående kod. Om så är fallet måste sector.indexoch track.index anges uttryckligen eftersom ”nuvarande” sektor och ”nuvarande”spår kanske inte är vad du vill ha. Om grafiken läggs direkt till den spår som är senast skapade, track.index kan ommitted eftersomDetta spår är bara markerat som ”Aktuellt” spår.

OK, nu lägger vi till histogram i det andra spåret. Här circos.trackHist()är enhögnivåfunktion vilket innebär att det skapar ett nytt spår (som du kan föreställa dig hist() är också en högnivåfunktion). bin.size är uttryckligen inställd så att binsize för histogram i alla celler är desamma och kan jämföras med varandra. (Se figur 1.3)

bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
första exemplet på circlize, lägga till det andra spåret.

figur 1.3: Första exemplet på circlize, lägga till det andra spåret.

i det tredje spåret och i panel.fun valde vi slumpmässigt 10 datapunkter ivarje cell, sortera dem efter x-värden och anslut dem med linjer. I followingcode, när sectors (det första icke namngivna argumentet), x och y argument anges icircos.track(), x-värden och Y-värden delas med df$sectors ochmotsvarande delmängd av X-och y-värden skickas till panel.fun genompanel.fun’s x och y argument. Således är x en y i panel.fun exakt värdena i den ”aktuella” cellen. (Se Figur1.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)})
första exemplet på circlize, lägga till det tredje spåret.

figur 1.4: första exemplet på circlize, lägga till det tredje spåret.

nu går vi tillbaka till det andra spåret och uppdaterar cellen i sektor ”d”.Detta görs av circos.updatePlotRegion() eller den korta versionencircos.update(). Funktionen raderar grafik som har lagts till.circos.update() kan inte ändra xlim och ylim i cellen såväl somandra inställningar relaterade till cellens position. circos.update() behöveratt uttryckligen ange sektorindex och spårindex om inte den ”aktuella”cellen är vad du vill uppdatera. Efter Anropet av circos.update()omdirigeras den” aktuella ” cellen till den cell du just angav och dukan använda grafiska funktioner på låg nivå för att lägga till grafik direkt i den.(Se figur 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")
första exemplet på circlize, uppdatera det andra spåret.

figur 1.5: första exemplet på circlize, uppdatera det andra spåret.

nästa fortsätter vi att skapa nya spår. Även om vi har gått tillbaka tillandra spåret, när vi skapar ett nytt spår, skapas det nya spåret fortfarande efter spåret som är mest inuti. I det här nya spåret lägger vi till värmekartor medcircos.rect(). Observera här har vi inte ställt in inmatningsdata, medan du bara ställer inylim – argumentet eftersom värmekartor bara fyller hela cellen från vänster till höger och från botten till toppen. Också det exakta värdet av ylim är inteviktigt och x, y i panel.fun() används inte (faktiskt är de bådaNULL). (Se figur 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)})
första exemplet på circlize, lägga till det fjärde spåret.

figur 1.6: första exemplet på circlize, lägga till det fjärde spåret.

i den mest inuti cirkeln läggs länkar eller band till. Det kan finnas länkarfrån en punkt till punkt, peka på intervall eller intervall till intervall. Avsnitt 3.11 ger detaljerad användning av länkar. (Se figur 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)
första exemplet på circlize, Lägg till länkar.

figur 1.7: första exemplet på circlize, Lägg till länkar.

Slutligen måste vi återställa grafiska parametrar och interna variabler, såatt det inte kommer att förstöra din nästa plot.

circos.clear()

Lämna ett svar

Din e-postadress kommer inte publiceras.