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

时间:2017-03-13 06:23:43

标签: r igraph

我正在使用带有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))

正如您所看到的,我尝试更改hgapvgap参数,但它显然不起作用。我也试过asp论证,但这不是我想要的。

enter image description here

2 个答案:

答案 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)

这为您提供以下内容 regualt_bipartite

如果我使用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_with asp

这看起来更好,但仍然不是我想要的 - 看看有些顶点比其他顶点更接近? 所以最终我采取了以下方法。将坐标设置为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

bipartite_final

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

注意 - 为了更好的可读性,我还减小了顶点的大小,标签的大小及其位置。

答案 1 :(得分:0)

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

我认为gephi是一种很好的网络可视化工具。