2016-07-20 5 views
1

Ich habe drei Datensätze, die ich mit Circlize plotten möchte. Die Sätze "a" und "b" enthalten positive und negative Werte, die Menge "c" enthält nur positive Werte. Ich möchte eine konsistente y-Achse für "a" und "b" und eine andere für "c" darstellen. Leider kann ich dazu keinen Weg finden.Wie legen Sie für jeden Sektor eines Kreisdiagramms separate Sätze von y-Achsenlimits fest?

Der Code, den ich verwende, ist unten, ich scheine nur einzigartige y-Achse für jede oder eine feste y-Achse für alle zu haben (wenn Sie "ylim ..." im Code auskommentieren).

Ich habe ein paar Dinge versucht, versuchen, Schleife mit der circos.lines() Funktion statt, aber das hat es nicht gelöst.

circos.info() zeigt separate y-Achse Grenzen, so denke ich, dass es möglich sein sollte.

Vielen Dank im Voraus.

library("circlize") 
library("reshape") 


#--- Data ---# 

a <- sort(rnorm(100,0,10)) 
b <- sort(rnorm(100,0,5)) 
c <- abs(rnorm(100,0,200)) 

data <- cbind("a" = a, "b" = b, "c" = c) 
data_melt <- melt(data) 


#--- Plotting ---# 

circos.initialize(  factors = data_melt$X2, 
         x = data_melt$X1, 
         sector.width = 1 
         ) 

circos.trackPlotRegion(factors = data_melt$X2, 
         y = data_melt$value, 
#      ylim = range(data_melt$value), 
         force.ylim = FALSE, 
         panel.fun = function(x, y) { circos.axis() } 
         ) 

circos.trackLines(  data_melt$X2, 
         data_melt$X1, 
         data_melt$value, 
         type = "h", 
         col = "grey", 
         lwd = 3, 
         baseline = 0)` 

circos.info(sector.index = NULL, track.index = 1) 

Antwort

2

ylim Matrix sein kann, in dem jede Zeile zu dem y-Bereich in jedem Sektor entspricht.

set.seed(123) 
a <- sort(rnorm(100,0,10)) 
b <- sort(rnorm(100,0,1)) 
c <- abs(rnorm(100,0,200)) 

data <- cbind("a" = a, "b" = b, "c" = c) 
data_melt <- melt(data) 


#--- Plotting ---# 
r_ab = range(data_melt[data_melt$X2 != "c", "value"]) 
r_c = range(data_melt[data_melt$X2 == "c", "value"]) 

circos.par(gap.degree = 5) 
circos.initialize(  factors = data_melt$X2, 
         x = data_melt$X1, 
         sector.width = 1 
         ) 

ylim = rbind(r_ab, r_ab, r_c) 
circos.trackPlotRegion(factors = data_melt$X2, 
         x = data_melt$X1, 
         y = data_melt$value, 
         ylim = ylim, 
         force.ylim = F, 
         panel.fun = function(x, y) { 
          circos.lines(x, y, type = "h", col = "grey", lwd =3, baseline = 0) 
          circos.axis(labels.cex = 0.6) 
          circos.yaxis(labels.cex = 0.6) 
         } 
         ) 
circos.clear() 

zog ich auch den Code circos.trackLines()-panel.fun() (weil ich denke, panel.fun() flexibler mehrere Schichten von Grafiken zu addieren).

Auch ich circos.yaxis() hinzugefügt, weil y-Achse verschiedene Bereiche in Sektoren hat, ist es wichtig, explizit die y-Bereiche anzuzeigen.

enter image description here

+0

Hallo Zuguang, danke für deine Antwort. Wissen Sie, wie Sie dies verallgemeinern können, wenn "a", "b" und "c" eine unterschiedliche Anzahl von Beobachtungen enthalten? Ich laufe gegen den Fehler: "Fehler in circos.lines (x, y, type =" h ", col =" grau ", lwd = 3, Grundlinie = 0): Länge von x und y unterscheiden sich.". Ich habe versucht, mit Sektor.index zu ändern, aber nicht in der Lage, es zu verallgemeinern. – Dominic

+0

Die Anzahl der Beobachtungen in jeder Kategorie sollte die Darstellung nicht beeinflussen. Können Sie überprüfen, ob 'data_melt $ X1' und' data_melt $ value' die gleiche Länge haben? Oder können Sie einen anderen Teil Ihres Codes überprüfen? Es funktioniert gut mit ungleicher Anzahl von Beobachtungen auf meiner Seite. –

+0

Entschuldigung, ich hatte in dem Code, den ich schreibe, etwas falsch angegeben. Es funktioniert jetzt. Danke nochmal und danke für das Paket. – Dominic