我正在使用带有R的igraph包绘制二分图。有大约10,000个边,我想扩展整个绘图的宽度以避免状态顶点重叠。
我的数据如下:
> test2
user_id state meanlat meanlon countUS countS degState
<chr> <chr> <dbl> <dbl> <int> <int> <int>
1 -_1ctLaz3jhPYc12hKXsEQ NC 35.19401 -80.83235 909 3 18487
2 -_1ctLaz3jhPYc12hKXsEQ NV 36.11559 -115.18042 29 3 37884
3 -_1ctLaz3jhPYc12hKXsEQ SC 35.05108 -80.96166 4 3 665
4 -0wUMy3vgInUD4S6KJInnw IL 40.11227 -88.22955 2 3 1478
5 -0wUMy3vgInUD4S6KJInnw NV 36.11559 -115.18042 23 3 37884
6 -0wUMy3vgInUD4S6KJInnw WI 43.08051 -89.39835 20 3 3963
以下是关于图表创建和设置的代码。
g2 <- graph_from_data_frame(test2,directed = F)
V(g2)$type <- ifelse(names(V(g2)) %in% UserStateR$user_id, 'user', 'state')
V(g2)$label <- ifelse(V(g2)$type == 'user', " ", paste(names(V(g2)),"\n",as.character(test2$degState),sep=""))
V(g2)$size <- ifelse(V(g2)$type == 'user', 3, 20)
V(g2)$color <- ifelse(V(g2)$type == 'user', 'wheat', 'salmon')
V(g2)$type <- ifelse(names(V(g2)) %in% UserStateR$user_id, T, F )
E(g2)$color <- heat.colors(8)[test2$countS]
plot(g2,layout=layout.bipartite(g2, types = names(V(g2)) %in% UserStateR$state, hgap = 50, vgap = 50))
正如您所看到的,我尝试更改hgap
和vgap
参数,但它显然不起作用。我也试过asp
论证,但这不是我想要的。
答案 0 :(得分:2)
我知道这对@floatsd来说可能为时已晚,但我今天正在努力解决这个问题并且很难找到答案,所以这可能会帮助其他人。
首先,一般来说,iplot.graph
有一个名为asp
的属性,可以非常简单地控制你的情节的矩形。只需做
l=layout.bipartite(CCM_net)
plot(CCM_net, layout=l, asp=0.65)
广泛的情节。小于1的asp
会为您提供一个宽图,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()
这看起来更好,但仍然不是我想要的 - 看看有些顶点比其他顶点更接近? 所以最终我采取了以下方法。将坐标设置为bipartite看起来像这样
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
现在顶点在矩形图中间隔很好!
注意 - 为了更好的可读性,我还减小了顶点的大小,标签的大小及其位置。
答案 1 :(得分:0)
我认为你可以用PDF输出。然后放大。
或者,使用rgexf
包输出gexf文件。然后在gephi中可视化。
我认为gephi是一种很好的网络可视化工具。