我知道这对@floatsd 来说可能为时已晚,但我今天正在努力解决这个问题并且很难找到答案,所以这可能会帮助其他人。
首先,一般来说,iplot.graph 有一个名为 asp 的属性,它非常简单地控制您的绘图的矩形程度。干脆做
l=layout.bipartite(CCM_net)
plot(CCM_net, layout=l, asp=0.65)
对于一个广泛的情节。 asp 小于 1 给你一个宽的情节,asp 大于 1 一个高情节。
但是,这可能仍然无法为您提供所需的布局。 bipartite 命令基本上会为您的顶点生成一个带有坐标的矩阵,实际上我还不明白它是如何得出 x 坐标的,所以我最终自己更改了它们。
在示例下方(我假设您知道如何将数据转换为具有边列表和边/顶点属性的数据框以制作图表,所以我跳过它)。
我的数据是CCM_data_sign 并且是
from to value
2 EVI MAXT 0.67
4 EVI MINT 0.81
5 EVI P 0.70
7 EVI SM 0.79
8 EVI AMO 0.86
11 MAXT EVI 0.81
18 MAXT AMO 0.84
21 MEANT EVI 0.88
28 MEANT AMO 0.83
29 MEANT PDO 0.71
31 MINT EVI 0.96
39 MINT PDO 0.78
40 MINT MEI 0.66
41 P EVI 0.91
49 P PDO 0.77
50 P MEI 0.71
51 PET EVI 0.90
58 PET AMO 0.89
59 PET PDO 0.70
61 SM EVI 0.94
68 SM AMO 0.90
69 SM PDO 0.81
70 SM MEI 0.73
74 AMO MINT 0.93
76 AMO PET 0.66
79 AMO PDO 0.71
80 AMO MEI 0.83
90 PDO MEI 0.82
我为绘图生成的数据框称为CCM_net。
首先是没有任何布局调整的二分图
V(CCM_net)$size<-30
l=layout.bipartite(CCM_net)
plot(CCM_net,
layout=l,
edge.arrow.size=1,
edge.arrow.width=2,
vertex.label.family="Helvetica",
vertex.label.color="black",
vertex.label.cex=2,
vertex.label.dist=c(3,3,3,3,3,3,3,3,3,3,3),
vertex.label.degree=c(pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,pi/2,pi/2,pi/2), #0 is right, “pi” is left, “pi/2” is below, and “-pi/2” is above
edge.lty=1)
这将为您提供以下内容
如果我使用asp,我会得到以下信息
plot(CCM_net,
layout=l,
edge.arrow.size=1,
vertex.label.family="Helvetica",
vertex.label.color="black",
vertex.label.cex=2,
vertex.label.dist=c(3,3,3,3,3,3,3,3,3,3,3),
vertex.label.degree=c(pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,pi/2,pi/2,pi/2), #0 is right, “pi” is left, “pi/2” is below, and “-pi/2” is above
edge.arrow.width=2,
edge.lty=1,
asp=0.6) # controls how rectangular the plot is. <1 = wide, >1 = tall
dev.off()
这看起来更好,但仍然不是我想要的 - 看看某些顶点之间的距离比其他顶点更近吗?
所以最终我采取了以下方法。将坐标设置为二分是这样的
coords <- layout_as_bipartite(CCM_net)
coords
[,1] [,2]
[1,] 3.0 0
[2,] 0.0 1
[3,] 2.0 1
[4,] 3.5 1
[5,] 6.0 1
[6,] 1.0 1
[7,] 5.0 1
[8,] 7.0 1
[9,] 1.0 0
[10,] 4.5 0
[11,] 5.5 0
此矩阵在第一列中显示顶点的 x 坐标,在第二列中显示 y 坐标,根据您的列表和名称进行排序。我的名字列表是
id name
1 EVI EVI
2 MAXT MAXT
3 MEANT MEANT
4 MINT MINT
5 P P
6 PET PET
7 SM SM
8 SR SR
9 AMO AMO
10 PDO PDO
11 MEI MEI
在我的图表中,EVI、AMO 和 PDO 位于底部,但请注意它们的 x 坐标:3.0、1.0、4.5 和 5.5。我还没有弄清楚代码是如何产生的,但我不喜欢它,所以我只是改变了它。
coords[,1]=c(2,0,4,8,12,16,20,24,9,16,24)
现在绘图代码(也带有asp)和输出变为
plot(CCM_net,
layout=coords,
edge.arrow.size=1,
vertex.label.family="Helvetica",
vertex.label.color="black",
vertex.label.cex=1,
vertex.label.dist=c(4,4,4,4,4,4,4,4,4,4,4),
vertex.label.degree=c(pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,-pi/2,pi/2,pi/2,pi/2), #0 is right, “pi” is left, “pi/2” is below, and “-pi/2” is above
edge.arrow.width=2,
edge.lty=1,
asp=0.6) # controls how rectangular the plot is. <1 = wide, >1 = tall
现在顶点在矩形图中的间距很好!
注意 - 我还减小了顶点的大小、标签的大小及其位置,以提高可读性。