R中使用tidygraph绘图时如何实现变量颜色跨多图统一?
问题原因
你使用grid.arrange布局的方式本身没有问题,颜色不一致是ggraph(基于ggplot2)的默认配色逻辑导致的:每张图会根据自身数据包含的分类值自动分配颜色,当不同图的分类值集合不同时,就会出现同一变量值对应颜色不同的情况。
解决方案
核心思路是提前全局定义分类值和颜色的固定映射关系,所有绘图强制调用该映射即可,修改后完整代码如下:
1. 原有数据创建逻辑不变
library(tidygraph) library(ggraph) library(gridExtra) library(dplyr) # create some data for the tbl_graph nodes <- data.frame(name = c("x4", NA, NA), label = c("x4", 5, 2)) nodes1 <- data.frame(name = c("x4", "x2", NA, NA, "x1", NA, NA), label = c("x4", "x2", 2, 1, "x1", 2, 7)) edges <- data.frame(from = c(1,1), to = c(2,3)) edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5), to = c(2, 3, 4, 5, 6, 7)) # create the tbl_graphs tg <- tbl_graph(nodes = nodes, edges = edges) tg_1 <- tbl_graph(nodes = nodes1, edges = edges1) # put into list myList <- list(tg, tg_1)
2. 新增固定颜色映射定义
# 提取所有图中name列的唯一有效值 all_valid_names <- unique(c( pull(activate(tg, nodes), name), pull(activate(tg_1, nodes), name) )) %>% na.omit() %>% as.character() # 自定义固定配色,键名对应分类值,值对应颜色 # 也可以用RColorBrewer/viridis等包自动生成配色: # fill_palette <- setNames(RColorBrewer::brewer.pal(length(all_valid_names), "Set1"), all_valid_names) fill_palette <- c( "x1" = "#E41A1C", "x2" = "#377EB8", "x4" = "#4DAF4A" ) # 文字颜色和填充色保持一致,也可单独定义 color_palette <- fill_palette # NA值对应的单独配色 na_fill <- "#999999" na_text_color <- "#FFFFFF"
3. 修改绘图函数,强制调用固定配色
plotFun <- function(List){ ggraph(List, "partition") + geom_node_tile(aes(fill = name), size = 0.25) + geom_node_label(aes(label = label, color = name)) + # 手动指定填充色映射,limits参数保证所有分类都被纳入映射规则 scale_fill_manual(values = fill_palette, na.value = na_fill, limits = names(fill_palette)) + # 手动指定文字颜色映射 scale_color_manual(values = color_palette, na.value = na_text_color, limits = names(color_palette)) + scale_y_reverse() + theme_void() + theme(legend.position = "none") } # 批量绘图、布局逻辑完全不变 allPlots <- lapply(myList, plotFun) n <- length(allPlots) nRow <- floor(sqrt(n)) do.call("grid.arrange", c(allPlots, nrow = nRow))
运行后所有图中同一变量值的颜色就会完全统一。
内容的提问来源于stack exchange,提问作者Electrino
相关产品推荐
相关产品推荐

