我正在尝试制作一个和弦图,其中顶点按因子(模块)分组,边缘由其他因素着色。
我非常喜欢使用edgebundle()
时所取得的布局,并尝试按照此处的所有说明进行操作:
(他描述了一种"黑客"为边缘着色的方法,但我无法做到这一点...) 所以,我找不到以任何简单的方式实现这两个着色规则的方法。
所以我想现在放弃edgebundle()
并重新开始使用像chordDiagram()
这样的函数 - 但是我真的很喜欢第一个函数中的布局(而且我已经花了太多时间在这上面)
也许有人可以帮助我,我可以坚持使用edgebundle()
。
这是我的步骤 - 它不漂亮,我道歉,我对R不太熟练,所以我经常做蠢事。
consensus_taxa
是边的数据框,其中taxa1和taxa2的标签包含它所属的模块编号的前缀,如下所示:
taxa1 taxa2 rho
1 3.ITS_Uncl.Mortierella_OTU985144 3.ITS_Uncl.Ascomycota_OTU258690 -0.9725180
2 1.ITS_Uncl.Mortierella_OTU979 1.ITS_Uncl.Mortierella_OTU2523736 0.9629500
3 3.ITS_Uncl.Pleosporales_OTU136349 3.ITS_Uncl.Basidiomycota_OTU258716 0.9615385
m_meta
是元数据,例如其他标签和模块信息:
m_meta[1:3,1:7]
comb taxa1 trt rho module
1 1.Bact_Uncl.Proteobacteria_OTU248 Bact_Uncl.Proteobacteria_OTU248 meadow -0.5000000 1
2 1.Bact_Uncl.Bacteroidetes_OTU695 Bact_Uncl.Bacteroidetes_OTU695 meadow -0.8434475 1
3 1.ITS_Uncl.Mortierella_OTU2523736 ITS_Uncl.Mortierella_OTU2523736 meadow 0.9629500 1
ID Org
1 Uncl.Proteobacteria Bact
2 Uncl.Bacteroidetes Bact
3 Uncl.Mortierella ITS
所以这是我的尝试:
g_my <- graph.data.frame(consensus_taxa, directed=F, vertices=m_meta)
mod_col <- as.factor(as.character(V(g_my)$module))
# generation random colors
cl <- colors(distinct = TRUE)
set.seed(15887) # to set random generator seed
mycols2 <- sample(cl, length(levels(mod_col)))
levels(mod_col) <- as.character(mycols2)
V(g_my)$color <- as.character(mod_col)
# Edge color green when positiv (rho >0) and red when negativ
edge_col <- matrix(nrow=0,ncol=1)
for (i in 1:length(consensus_taxa$rho)){
t <- consensus_taxa$rho[i]
ecol <- if(t>0) {as.character("green")} else {as.character("red")}
edge_col <- rbind(edge_col, ecol)
print(i/length(consensus_taxa$rho)) }
E(g_my)$color <- as.character(edge_col)
v_lab <- as.character(m_meta$ID)
#### Loosing sorting of the vertex in the circle (and in the general the layout is fare from nice)
plot(g_my, layout = layout.circle, vertex.size=degree(g_my)*0.5, vertex.label = v_lab)
#### loosing color codes and labels in this way, but layout is in general nice
edgebundle(g_my)->eb
eb
有什么建议吗?
它的外观如下(第一个中也存在尺寸问题)。
[![edgebundle][1]][1]
[![normal_plot][2]][2]
[![no_labels][3]][3]