如何在igraph中设置反向边权重(小权重对应粗边)
问题:反转网络图边权重的粗细映射(小权重对应粗边)
我改编了代码绘制带权重的无向网络图,原代码如下:
# Create data set.seed(1) data <- matrix(sample(0:3, 25, replace=TRUE), nrow=5) data[lower.tri(data)] <- NA rownames(data) <- LETTERS[1:5] colnames(data) <- LETTERS[1:5] # Transform it in a graph format network <- graph_from_adjacency_matrix(data, weighted = TRUE) # Remove edges with NA weights network <- delete_edges(network, E(network)[is.na(E(network)$weight)]) # Make the graph ggraph(network) + geom_edge_link(aes(edge_width=E(network)$weight), edge_colour="black", edge_alpha=0.3) + geom_node_point(color="#69b3a2", size=5) + geom_node_text(aes(label=name), repel = TRUE, size=8, color="#69b3a2") + theme_void() + theme( legend.position="none", plot.margin=unit(rep(1,4), "cm") )
但我的场景中数值越小代表连接越强,因此需要实现小权重对应更粗边的效果——比如示例里D>C边应最粗,A>C边应最细,请问该如何实现?
解决方案:反转权重的数值映射
核心思路是将原权重值反转,让小权重对应更大的edge_width数值。可以通过「权重最大值 - 当前权重」的方式实现,这样原权重0会变成最大值,对应最粗的边;原权重3会变成0,对应最细的边(如果需要保留最小宽度,也可以加一个基础值,比如max_weight - weight + 1)。
修改后的完整代码
# Create data set.seed(1) data <- matrix(sample(0:3, 25, replace=TRUE), nrow=5) data[lower.tri(data)] <- NA rownames(data) <- LETTERS[1:5] colnames(data) <- LETTERS[1:5] # Transform it in a graph format network <- graph_from_adjacency_matrix(data, weighted = TRUE) # Remove edges with NA weights network <- delete_edges(network, E(network)[is.na(E(network)$weight)]) # 计算反转后的权重(用最大权重减去当前权重) max_weight <- max(E(network)$weight) reversed_weight <- max_weight - E(network)$weight # Make the graph ggraph(network) + # 这里使用反转后的权重作为edge_width的映射值 geom_edge_link(aes(edge_width=reversed_weight), edge_colour="black", edge_alpha=0.3) + geom_node_point(color="#69b3a2", size=5) + geom_node_text(aes(label=name), repel = TRUE, size=8, color="#69b3a2") + theme_void() + theme( legend.position="none", plot.margin=unit(rep(1,4), "cm") )
关键修改点
- 先计算权重的最大值
max_weight <- max(E(network)$weight),保证代码的通用性(即使后续数据权重范围变化也能适配) - 生成反转权重
reversed_weight <- max_weight - E(network)$weight,原权重越小,反转后的值越大 - 在
geom_edge_link的aes中,将edge_width替换为reversed_weight
这样就能实现「数值越小,连接越强,边越粗」的效果,示例中D>C边的原权重是0,反转后为3,对应最粗的边;A>C边原权重是3,反转后为0,对应最细的边。
内容的提问来源于stack exchange,提问作者Catherine Laing
相关产品推荐
相关产品推荐

