如何根据阈值为ggraph边设置指定颜色?解决自定义颜色失效问题
解决ggraph中scale_color_manual自定义颜色不生效的问题
你遇到的问题是:用ggraph绘制网络图时,想根据edges数据框的weight值(以50为阈值)区分边的颜色,但scale_color_manual设置的自定义颜色没生效,反而用了随机颜色。
原代码如下:
library(ggraph) library(igraph) # Data frame nodes nodes <- data.frame( id = c(1, 2, 3, 4, 5), label = c("Especie1", "Especie2", "Especie3", "Especie4", "Especie5") ) # Data frame edges edges <- data.frame( from = c(1, 2, 3, 4, 5, 1, 3), to = c(2, 3, 4, 5, 1, 4, 5), weight = c(60, 40, 30, 70, 80, 90, 20) ) # I create the graph graph <- graph_from_data_frame(edges, vertices = nodes) # Graphic with ggraph ggraph(graph, layout = "stress") + geom_edge_link(aes(color = ifelse(edges$weight > 50, "Above Threshold", "Below Threshold"))) + geom_node_text(aes(label = label)) + scale_color_manual(values = c("Above Threshold" = "red", "Below Threshold" = "yellow")) + theme_void()
问题原因
你在geom_edge_link的aes里直接引用了外部的edges$weight,但ggraph在渲染图层时,是基于igraph对象内部的边属性,而非原始的edges数据框。这种外部引用会导致ggplot无法正确将这个衍生变量识别为映射的离散分类,进而忽略scale_color_manual的自定义设置。
解决方案
直接在aes中引用igraph对象自带的weight边属性即可,因为graph_from_data_frame已经将edges的所有列转化为图的边属性。
修正后的代码:
library(ggraph) library(igraph) nodes <- data.frame( id = c(1, 2, 3, 4, 5), label = c("Especie1", "Especie2", "Especie3", "Especie4", "Especie5") ) edges <- data.frame( from = c(1, 2, 3, 4, 5, 1, 3), to = c(2, 3, 4, 5, 1, 4, 5), weight = c(60, 40, 30, 70, 80, 90, 20) ) graph <- graph_from_data_frame(edges, vertices = nodes) ggraph(graph, layout = "stress") + # 直接引用边属性weight,而非外部edges$weight geom_edge_link(aes(color = ifelse(weight > 50, "Above Threshold", "Below Threshold"))) + geom_node_text(aes(label = label)) + scale_color_manual(values = c("Above Threshold" = "red", "Below Threshold" = "yellow")) + theme_void()
另一种更规范的写法(提前创建分类变量)
你也可以先给igraph对象的边添加一个分类属性,再在映射中使用,这样代码可读性更好:
# 给边添加分类属性 E(graph)$weight_category <- ifelse(E(graph)$weight > 50, "Above Threshold", "Below Threshold") ggraph(graph, layout = "stress") + geom_edge_link(aes(color = weight_category)) + geom_node_text(aes(label = label)) + scale_color_manual(values = c("Above Threshold" = "red", "Below Threshold" = "yellow")) + theme_void()
这两种写法都能让ggplot正确识别离散分类变量,从而应用你设置的自定义颜色。
内容的提问来源于stack exchange,提问作者Jime Chaves
相关产品推荐
相关产品推荐

