【问题标题】:want to expand a large bipartite network plot avoid vertices overlapped想扩大一个大的二分网络图避免顶点重叠
【发布时间】:2017-09-15 11:23:47
【问题描述】:

我正在使用带有 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 参数,但这不是我想要的。

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    我知道这对@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
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 2012-01-30
        相关资源
        最近更新 更多