是否可以在circlize包中制作显示log10值的和弦图?到目前为止,我已经能够生成具有正确尺寸链接的绘图,但相应的轴将不匹配。轴显示每个扇区的所有链接/记录值的总和,这是不正确的,因为求和记录值与求和的原始值不对应。有没有办法解决这个轴问题?
下面的是我迄今为止尝试过的一个例子
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))
}
)
答案 0 :(得分:1)
我认为解决这个问题是不可能的。由于扇区由多个链接组成,如果扇区的大小是对数变换的,那么每个链接的宽度是什么意思?我认为我们应该更好地忘记每个部门的规模,而不是显示轴。另一方面,我们可以直接在每个链接之下或之上显示非对数转换值。
在下面的代码中,实际上,chordDiagram()
返回一个包含每个链接位置的数据框,然后我们可以使用此信息将未记录的值添加到正确的位置。
另请注意代码中chordDiagram()
中的第一个参数是错误的。我纠正了它。
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)
}