如何在R的ggplot中为重排序因子保留原有颜色
解决ggplot因子重排序后颜色变化的问题
问题原因
ggplot的默认填充色是按因子水平的顺序分配的:
- 原变量
x2转因子后,水平顺序为c("c", "a", "b"),默认调色板的前3种颜色依次对应这三个水平; - 重排序后的
x4水平顺序为c("a", "b", "c"),调色板会按新顺序重新分配颜色,导致每个类别对应的颜色和原图不一致。
解决方案:手动绑定类别与颜色
通过scale_fill_manual()指定每个类别对应的颜色,就能在重排序因子的同时保留原颜色映射。
方法1:提取原图表的颜色映射
先获取x2作为填充变量时的颜色,再将其绑定到重排序后的因子上:
x1 <- runif(100) x2 <- c(rep("c", 30), rep("a", 40), rep("b", 30)) x3 <- rep(seq(0,9), 10) mydata <- as.data.frame(cbind(x1, x2, x3)) mydata$x4 <- factor(mydata$x2, levels = c("a", "b", "c"), ordered = TRUE) mydata$x1 <- as.numeric(mydata$x1) mydata$x2 <- as.factor(mydata$x2) mydata$x3 <- as.factor(mydata$x3) # 提取原x2对应的颜色映射 p_original <- ggplot(mydata, aes(x = x3, y = x1, fill = x2)) + geom_boxplot() original_colors <- unique(ggplot_build(p_original)$data[[1]]$fill) color_map <- setNames(original_colors, levels(mydata$x2)) # 绘制重排序后的图表,保留原颜色 ggplot(mydata, aes(x = x3, y = x1, fill = x4)) + geom_boxplot() + labs(x = "x3", y = "x1") + theme(plot.title = element_text(hjust = 0.5, size = 12), legend.position = "top") + scale_fill_manual(values = color_map)
方法2:直接指定默认调色板颜色
如果你知道ggplot默认离散填充色的顺序(前3种为#F8766D、#00BA38、#619CFF),可以直接手动绑定:
# 定义颜色映射,对应x2的水平顺序:c、a、b color_map <- c("c" = "#F8766D", "a" = "#00BA38", "b" = "#619CFF") ggplot(mydata, aes(x = x3, y = x1, fill = x4)) + geom_boxplot() + labs(x = "x3", y = "x1") + theme(plot.title = element_text(hjust = 0.5, size = 12), legend.position = "top") + scale_fill_manual(values = color_map)
效果说明
两种方法都能实现:重排序后的因子(图例顺序为a、b、c),每个类别对应的颜色和使用x2时完全一致。
内容的提问来源于stack exchange,提问作者Phoebe
相关产品推荐
相关产品推荐

