使用ggplot2绘制柱状图时自定义柱子填充色不生效如何解决
错误原因
你的自定义填充规则不生效,核心是两个语法错误:
fill美学映射位置错误:fill参数被写在了aes()函数外部,ggplot 无法将填充色规则和数据变量绑定。- 映射变量不存在:你写的
fill = x中,x并不是 mpg 数据集内的字段,没有将填充色分组依据指定为目标变量class,后续的scale_fill_manual找不到作用对象,柱子就会显示默认的灰色填充。
修改方法
将 fill = class 移入 aes() 函数内部即可让自定义配色生效。
修正后的基础代码(和你原有逻辑完全一致)
library(ggplot2) library(dplyr) mpg %>% ggplot(aes(x = class, fill = class)) + geom_bar(width = 0.7, color = "black", size = 0.8) + scale_fill_manual(values = c("2seater" = "red", "compact" = "white", "midsize" = "white", "minivan" = "white", "pickup" = "green", "subcompact" = "white", "suv" = "white"))
更简洁的写法(无需手动枚举所有非目标类别)
你不需要逐个给其余class类别指定白色,可以先构造全白的配色向量,再单独替换两个目标类别的颜色,代码更易维护:
library(ggplot2) library(dplyr) # 先生成所有class类别对应白色的命名向量 fill_cols <- setNames(rep("white", n_distinct(mpg$class)), unique(mpg$class)) # 单独给两个目标类别赋值 fill_cols[c("2seater", "pickup")] <- c("red", "green") mpg %>% ggplot(aes(x = class, fill = class)) + geom_bar(width = 0.7, color = "black", size = 0.8) + scale_fill_manual(values = fill_cols)
内容的提问来源于stack exchange,提问作者Keith Duong
相关产品推荐
相关产品推荐

