You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:27:00