【问题标题】:Is there a way to have separate weighted edges for ins and outs in igraph R?有没有办法在 igraph R 中为输入和输出单独加权边缘?
【发布时间】:2020-06-27 22:55:54
【问题描述】:

我正在使用 igraph 包在 R studio 中创建一个定向网络。我想在适用的情况下显示节点之间的两条边,都是加权的,一条用于输入,一条用于输出。我对 R 非常陌生,并且设法获得了可以编译输入和输出但希望它们分开的加权边缘。

我用谷歌搜索了我的问题,但无济于事,可能是措辞错误。如果我措辞不好,我提前道歉。

编辑:最小可重复样本:

OPR.df <- data.frame("From" = c(c("8", "8", "8", "8", "7", "25", "24", "1A", "12", "12"),
                                c("12", "12", "12", "17", "17", "17"),
                                c("17", "17", "17", "17"),
                                c("17", "17", "17", "17", "17", "9A", "9", "17", "9", "17", "9"),
                                c("9", "17", "17", "17")),
                     "To" = c(c("8", "8", "8", "7", "25", "24", "1A", "12", "12", "12"), 
                              c("12", "12", "17", "17", "17", "17"),
                              c("17", "17", "17", "17"),
                              c("17", "17", "17", "17", "9A", "9", "17", "9", "17", "9", "17"),
                              c("17", "17", "17", "17")))


opr.d <- graph_from_data_frame(d = OPR.df,  
                             directed = T)

# I think this is the part where I set this??
E(opr.d)$weight <- 1

opr.sd <- simplify(opr.d,
            remove.multiple = T,
            remove.loops = F,
            edge.attr.comb = c(weight = "sum",
                               type = "ignore"))
E(opr.sd)$width <- E(opr.sd)$weight/3

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 抱歉,我刚刚加了一个!

标签: r networking network-programming igraph


【解决方案1】:

您可以做很多事情来实现双向 链接更明显。首先,使用默认布局人群进行绘图 顶点 9、9A 和 17 靠得太近。没有空间 看到边缘。我将使用 layout_with_graphopt ,效果很好 对于此示例,尽管对于更复杂的示例,您可能需要 进一步调整布局。

set.seed(4321)
plot(opr.sd, xpd=NA)
set.seed(4321)
plot(opr.sd, layout=layout_with_graphopt)

当然,您的原始问题仍然存在问题: 箭头相互重叠。您可以使用edge.curved 解决此问题 争论。我希望所有的箭头都是直的除了 重叠,所以我创建了一个自定义曲率矢量来仅调整 重叠的边缘。此外,箭头太大,很难 看到箭头,所以我把头做得小了一点。总之,我们得到:

CURV = rep(0,ecount(opr.sd))
CURV[2]  = 0.6
CURV[11] = 0.6
CURV[13] = 0.6

set.seed(4321)
plot(opr.sd, layout=layout_with_graphopt, 
    edge.arrow.size=0.7, edge.curved=CURV, frame=T)

您可能仍想稍微调整一下,但我认为这表明 解决问题的途径。

【讨论】:

  • 谢谢!这真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2013-04-24
  • 1970-01-01
  • 2020-10-08
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多