如何根据边缘属性为 R 中 igraph 图中的边缘分配颜色范围?

时间:2021-04-06 18:18:03

标签: r igraph

我有一个大型社交网络图,我试图使用个人之间联系的强度对它进行颜色编码。在mock_table中,个体列在a列和b列中,每个连接的强度列在c列中。

我成功地将这些强度值正确分配给 edge.width 函数,但是,当我尝试将其应用于 edge.color 时,这些值没有正确对齐。图中的颜色确实代表 sn_color,但它们没有分配到正确的边缘。最粗的边缘(最强的连接,最大的 c 值)也应该具有最深的颜色,反之亦然。

以下是我当前代码的简化版本:

mock_table <- as.data.frame(cbind(a=c("PO", "BL", "MA", "AL", "BL"), b=c("MA", "BO", "ED", "MA", "MA"), c=as.numeric(c(8,41,10,23,50))))
mock_table$c <- as.numeric(as.character(mock_table$c))

sn_graph <- graph_from_data_frame(d=mock_table, vertices = c("PO", "BL", "MA", "AL", "BO", "ED"), directed = FALSE)
sn_proximity <- (mock_table$"c")

sn_colorrange <- colorRampPalette(c("yellow", "orange", "red", "darkred"))
sn_color <- sn_colorrange(length(sn_proximity))

plot(sn_graph,
     edge.width=(1/3)*(sn_proximity),
     edge.color=sn_color
     )

谁能帮我弄清楚如何正确分配这个调色板?非常感谢!

经过编辑以包含可重现的示例代码。

1 个答案:

答案 0 :(得分:0)

您需要准确地告诉绘图要使用哪种颜色。如果您想为渐变中的每个颜色使用不同的颜色,那么您可以执行以下操作

plot(sn_graph,
     edge.width=(1/3)*(sn_proximity),
     edge.color=sn_color[order(sn_proximity)]
)

否则可能更常见的是设置固定数量的 bin 然后使用 cut() 使颜色具有更多含义

n_bins <- 5
sn_color <- sn_colorrange(n_bins)
plot(sn_graph,
     edge.width=(1/3)*(sn_proximity),
     edge.color=sn_color[cut(sn_proximity, breaks=n_bins )]
)