2016-09-15 5 views
0

Ist es möglich, im circlize-Paket ein Akkorddiagramm zu erstellen, das log10-Werte anzeigt? Bisher war ich in der Lage, ein Diagramm mit Links in korrekter Größe zu erstellen, aber die entsprechende Achse stimmt nicht überein. Die Achse zeigt die Summe aller Verbindungen/geloggten Werte pro Sektor an, was nicht korrekt ist, da die Summierung protokollierter Werte nicht summierten Rohwerten entspricht. Gibt es eine Möglichkeit, dieses Achsenproblem zu beheben?R Kreissehnen-Diagramm mit logarithmischer Skala

unten ist ein Beispiel dafür, was ich versucht habe bisher

library(circlize) 

export_country <- c("DEU","USA","IDN","USA","IDN","USA","IDN","CAN","DEU","DEU","IDN","NZL","DEU","USA","USA","USA","IDN","SGP","IDN") 
import_country <- c("JPN","JPN","USA","JPN","TWN","CAN","CHN","USA","CHN","CHN","DEU","JPN","USA","DNK","JPN","CHN","JPN","CHN","CHN") 
flow <- c(2000,65780,78010,851,35353,845,738,120788,245900,90002,4426,6870,152681,78114,32591,19274,10915,23100,6275) 

df <- data.frame(export_country, import_country, flow,stringsAsFactors = FALSE) 


country = unique(c(df[[1]], df[[2]])) 
color <- c("#E41A1C","#800000","#ff8c00","#ffd700","#008000","#00bfff","#377EB8", 
       "#ff69b4","#800080","#4b0082") 

df1 <- data.frame(country, color,stringsAsFactors = FALSE) 

circos.clear() 
circos.par(start.degree = 90, gap.degree = 5, track.margin = c(-0.1, 0.1), points.overflow.warning = FALSE) 
par(mar = rep(0, 4)) 

chordDiagram(x = df[1:2],log10(df[3]), grid.col = color, transparency = 0.25, 
     order = country, directional = 1, 
     direction.type = c("arrows", "diffHeight"), diffHeight = -0.04, 
     annotationTrack = c("grid","axis"), annotationTrackHeight = c(0.05, 0.1), 
     link.arr.type = "big.arrow", link.sort = TRUE, link.largest.ontop = TRUE) 



circos.trackPlotRegion(
    track.index = 1, 
    bg.border = NA, 
    panel.fun = function(x, y) { 
xlim = get.cell.meta.data("xlim") 
sector.index = get.cell.meta.data("sector.index") 
country = df1$country[df1$country == sector.index] 

circos.text(x = mean(xlim), y = 4.4, 
      labels = country, facing = "bending", cex = 1, niceFacing = TRUE, adj = c(0.5, 0)) 

    } 
) 

die the following plot

Antwort

1

gibt, gebe ich denke, dass es unmöglich ist, dieses Problem zu lösen. Da ein Sektor aus mehreren Links zusammengesetzt ist, was bedeutet die Breite jedes Links, wenn die Größe des Sektors logtransformiert wird? Ich denke, wir sollten das Ausmaß jedes Sektors besser vergessen und die Achsen nicht zeigen. Auf der anderen Seite können wir den unlog-transformierten Wert direkt unter oder über jedem Link anzeigen.

Im folgenden Code, tatsächlich, chordDiagram() gibt einen Datenrahmen, der Positionen von jedem Link enthält, können wir diese Informationen verwenden, um nicht geloggte Werte nur an der richtigen Stelle hinzuzufügen.

Bitte beachten Sie auch das erste Argument in chordDiagram() in Ihrem Code war falsch. Ich habe es korrigiert.

library(circlize) 

export_country <- c("DEU","USA","IDN","USA","IDN","USA","IDN","CAN","DEU","DEU","IDN","NZL","DEU","USA","USA","USA","IDN","SGP","IDN") 
import_country <- c("JPN","JPN","USA","JPN","TWN","CAN","CHN","USA","CHN","CHN","DEU","JPN","USA","DNK","JPN","CHN","JPN","CHN","CHN") 
flow <- c(2000,65780,78010,851,35353,845,738,120788,245900,90002,4426,6870,152681,78114,32591,19274,10915,23100,6275) 

df <- data.frame(export_country, import_country, flow,stringsAsFactors = FALSE) 
df[[3]] = log10(df[[3]]) 

country = unique(c(df[[1]], df[[2]])) 
color <- c("#E41A1C","#800000","#ff8c00","#ffd700","#008000","#00bfff","#377EB8", 
       "#ff69b4","#800080","#4b0082") 

df1 <- data.frame(country, color,stringsAsFactors = FALSE) 

circos.clear() 
circos.par(start.degree = 90, gap.degree = 5, track.margin = c(-0.1, 0.1), points.overflow.warning = FALSE) 
par(mar = rep(0, 4)) 

res = chordDiagram(x = df, grid.col = color, transparency = 0.25, 
     order = country, directional = 1, 
     direction.type = c("arrows", "diffHeight"), diffHeight = -0.04, 
     annotationTrack = c("grid"), annotationTrackHeight = c(0.05, 0.1), 
     link.arr.type = "big.arrow", link.sort = TRUE, link.largest.ontop = TRUE) 



circos.trackPlotRegion(
    track.index = 1, 
    bg.border = NA, 
    panel.fun = function(x, y) { 
    xlim = get.cell.meta.data("xlim") 
    sector.index = get.cell.meta.data("sector.index") 
    country = df1$country[df1$country == sector.index] 

    circos.text(x = mean(xlim), y = 1.5, 
       labels = country, facing = "bending", adj = c(0.5, 0), cex = 1, niceFacing = TRUE) 

     } 
) 

for(i in seq_len(nrow(res))) { 
    circos.text(x = res$x1[i] - res$value[i]/2, y = 0.5, round(10^(res$value[i])), facing = "inside", 
     niceFacing = TRUE, adj = c(0.5, 0.5), cex = 0.5, col = "white", sector.index = res$rn[i], track.index = 1) 
    circos.text(x = res$x2[i] - res$value[i]/2, y = 0.5, round(10^(res$value[i])), facing = "inside", 
     niceFacing = TRUE, adj = c(0.5, 0.5), cex = 0.5, col = "white", sector.index = res$cn[i], track.index = 1) 
} 

enter image description here

Verwandte Themen