【问题标题】:Change edge thickness according to a column of a dataframe containing relations between actors根据包含参与者之间关系的数据框列更改边缘厚度
【发布时间】:2021-12-14 08:35:36
【问题描述】:

此代码根据参与者和关系的数据框绘制图表。

library(igraph)
actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
                            "Esmeralda"))
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
                        friendship=c(4,15,5,2,11,1))
g <- graph_from_data_frame(relations, directed=TRUE, vertices=actors)

plot(g)

结果是:

我想根据relations$friendship 的值更改圆弧的粗细(而不是长度)。

【问题讨论】:

标签: r plot igraph


【解决方案1】:

试试

plot(g,edge.width = E(g)$friendship, edge.arrow.size = E(g)$friendship)


请注意,E(g)$friendship 的第一个值被分配给edge.arrow.size,而不是向量。也许改进的功能会添加到未来的igraph 版本中。

arrow.size 箭头的大小。目前这是一个常数,所以它 每条边都是一样的。如果一个向量被提交,那么只有 使用第一个元素,即。如果这是从边缘属性中获取的 那么只有第一条边的属性用于所有箭头。这 未来可能会发生变化。

默认值为 1。

arrow.width 箭头的宽度。目前这是一个常数,所以 每个边缘都是一样的。如果一个向量被提交,那么只有 使用第一个元素,即。如果这是从边缘属性中获取的 那么只有第一条边的属性用于所有箭头。这 未来可能会发生变化。

此参数目前仅由 plot.igraph 使用。

默认值为 1,与之前的宽度相同 选项出现在 igraph 中。

【讨论】:

    【解决方案2】:

    这可以很简单地实现。 首先是您的代码:

    library(igraph)
    
    actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
                                "Esmeralda"))
    relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                                   "David", "Esmeralda"),
                            to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
                            friendship=c(4,15,5,2,11,1))
    g <- graph_from_data_frame(relations, directed=TRUE, vertices=actors)
    
    

    现在让我们创建一个粗细为 2、线条颜色为黑色、线条类型为 2 的图形。

    plot(g, edge.width = 2, edge.color = "black", edge.lty = 2)
    

    当然,你可以随心所欲地改变它

    plot(g, edge.width = 5, edge.color = "black", edge.lty = 1)
    

    希望这就是你的意思。

    小更新

    最后,您可能想要找到元素的坐标。你可以这样做:

    coords = layout_nicely(g)
    coords[5,]=c(20, 20)
    coords
    

    输出

             [,1]     [,2]
    [1,] 15.21285 18.97650
    [2,] 15.18511 20.08411
    [3,] 14.21575 19.70269
    [4,] 16.17453 19.75255
    [5,] 20.00000 20.00000
    

    剧情

    plot(g, layout=coords, edge.width = 5, edge.color = "black", edge.lty = 1)
    

    还可以设置其他的cutout属性

    plot(g, vertex.size = 20, vertex.color = "red", vertex.shape = "square", 
         edge.width = 3, edge.color = "black", edge.lty = 3, 
         edge.label = relations$friendship, edge.curved = TRUE)
    

    还要注意,这些参数中的任何一个也可以来自向量。 因此,例如,来自变量friendship 的厚度没有障碍。

    plot(g, vertex.size = 20, vertex.color = "red", 
         vertex.shape = c("square","circle","square","circle","rectangle"), 
         edge.width = relations$friendship, edge.color = "black", edge.lty = c(1,2,3,1,2,3), 
         edge.label = 10:20, edge.curved = TRUE)
    

    【讨论】:

    • 我不明白您的回答如何解决如何“更改弧的粗细” 的问题。无论$friendship如何,这里的所有线条粗细都是相同的。我错过了什么吗?
    • 亲爱的@r2evans,你是绝对正确的!出于动力,我只是将relations$friendship 分配给edge.label 而不是edge.width。我希望这个小小的疏忽会被原谅。
    • 亲爱的@r2evans,你很好。感谢您所有我最近从您那里收到的赞成票 :-)。
    • 关于上面的问题,当我读到它时,@Mark 几乎不可能只问设置箭头粗细这样一个小问题,甚至为答案提供奖励。您可能从我那里更清楚地知道,有时人们会问一些比从他们的问题内容中可以读到的东西更多的东西。无论如何,我曾多次遇到过,在写出与所提问题准确对应的答案时,我没有得到批准,因为有人回答的范围更广。
    • 答案并不总是根据客观指标被接受,有时它们会因为时间而被接受,或者更好和更通用的答案看起来更可怕。如果验收由更了解材料的人控制,那么 SO 将是一个非常不同的地方。我同意这可能会令人沮丧,但是......我不能声称基于 $$$ 的入场成本没有得到我的“金钱价值” :-)
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多