【问题标题】:Depict supply network structures描绘供应网络结构
【发布时间】:2018-11-14 22:24:52
【问题描述】:

我想绘制一个供应网络结构。我曾尝试使用 igraph,但直到现在还没有得出合理的结果。一个示例如下所示:

library(igraph)
d <- read.table(text = "V1 V2 weight
            s1  p1  88
            s3  p1  100
            s2  p2  100
            s3  p2  43
            p1  c1  21
            p1  c2  79
            p1  c3  88
            p2  c1  22
            p2  c2  121
            ", stringsAsFactors = F, header = T)

g <- graph_from_data_frame(d, directed = T)
plot(g, layout=layout.fruchterman.reingold,
     edge.width=E(g)$weight/20,
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70")   

这给出了:

问题是网络有一个额外的结构。一个合理的 - 除其他外 - 结果将显示“s”节点(供应商)应该在左三分之一,“p”节点(工厂)应该在中间,c节点(客户)应该在中间右手边。这对 igraph 是否可行(以及如何)?是否有其他软件包可以做到这一点?

【问题讨论】:

标签: r plot


【解决方案1】:

是的,这可以通过 igraph 实现。制作自己的布局的一种方法。一种简单的方法是将所有“s”节点放置在 x=1,将“p”节点放置在 x=2,将“c”节点放置在 x=3。每种类型 (s,p,c) 的每个不同节点都应获得唯一的 y 值,以便它们不会重叠。使用您的示例图:

LO = matrix(0, nrow=vcount(g), ncol=2)
LO[grep("s", V(g)$name), 1] = 1
LO[grep("p", V(g)$name), 1] = 2
LO[grep("c", V(g)$name), 1] = 3
LO[,2] = ave(rep(1, vcount(g)), LO[,1], FUN = seq_along) 

plot(g, layout=LO, edge.width=E(g)$weight/20, 
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70") 

另外,跟进@Henrik 的评论,您可以使用layout_with_sugiyama。您仍然需要定义 (s,p,c) 层。此外,杉山垂直排列图层。您需要交换 x 和 y 坐标以获得水平布局。

Layers = rep(0,vcount(g))
Layers[grep("s", V(g)$name)] = 3
Layers[grep("p", V(g)$name)] = 2
Layers[grep("c", V(g)$name)] = 1
LO2 = layout_with_sugiyama(g, layers=Layers)$layout
LO2 = LO2[,2:1]

plot(g, layout=LO2, edge.width=E(g)$weight/20, 
     vertex.shape = "none", vertex.label.font = 2,
     vertex.label.cex=1.1, edge.color="gray70") 

【讨论】:

  • 你甚至做了轮换。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2010-10-03
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
相关资源
最近更新 更多