想要扩展大型二分网络图避免顶点重叠

want to expand a large bipartite network plot avoid vertices overlapped

我正在使用 igraph 包和 R 绘制二分图。大约有 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))

如您所见,我已尝试更改 hgapvgap 参数,但显然不起作用。我也尝试过 asp 参数,但这不是我想要的。

我觉得你可以用PDF输出。然后放大。 或者,使用 rgexf 包输出 gexf 文件。然后在gephi中可视化。

我觉得gephi是一个不错的网络可视化工具

我知道这对@floatsd 来说可能为时已晚,但我今天一直在努力解决这个问题,很难找到答案,所以这可能会帮助其他人。

首先,一般来说,iplot.graph 有一个名为 asp 的属性,它可以非常简单地控制绘图的矩形程度。简单地做

l=layout.bipartite(CCM_net)    
plot(CCM_net, layout=l, asp=0.65)

为了宽阔的情节。 asp 小于 1 为宽地块,asp 大于 1 为高地块。

但是,这可能仍然无法为您提供所需的布局。 bipartite 命令基本上生成一个带有顶点坐标的矩阵,实际上我还不明白它是如何得出 x 坐标的,所以我最终自己更改了它们。 在示例下方(我假设您知道如何使用边缘列表和 edge/vertex 属性将数据转换为数据框以制作图形,所以我跳过了它)。 我的数据是 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

现在矩形图中的顶点间隔很好!

注意 - 我还减小了顶点的大小、标签的大小及其位置,以提高可读性。