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

升级R与ggplot2后所有ggplot图形呈灰色无填充色如何解决

问题根因

R 4.0.0及以上版本中,as.data.frame()的stringsAsFactors参数默认值从TRUE调整为FALSE,你原代码的数据预处理步骤存在逻辑漏洞,在新版本R下运行会导致填充映射变量失效:

  1. 你使用cbind(Tr,rejA,Matingdiet)拼接变量时,会自动将所有变量强制转换为字符型,再转数据框后d$Matingdiet为字符型,本身没有levels属性
  2. 后续执行d$Matingdiet<-factor(d$Matingdiet,levels = rev(levels(d$Matingdiet)))时,levels(d$Matingdiet)返回NULL,最终会将d$Matingdiet转换为所有值为NA的因子
  3. ggplot2映射到全为NA的变量时,就会出现所有柱子为灰色、不显示图例的问题

解决方法

优先修正数据预处理逻辑,避免不必要的类型转换:

rejA<-c(0.05,0.10,0.00,0.05)
Tr<-c("Corn\nmale\nx\nCorn\nfemale","Corn\nmale\nx\nWheat\nfemale","Wheat\nmale\nx\nCorn\nfemale","Wheat\nmale\nx\nWheat\nfemale")
Matingdiet<-c("Same diet","Different diets","Different diets", "Same diet")
# 直接构造数据框,保留各变量原有类型
d <- data.frame(
  Tr = Tr,
  rejA = rejA,
  Matingdiet = Matingdiet
)
# 手动指定因子水平,不要调用未生成的因子的levels
d$Matingdiet<-factor(d$Matingdiet, levels = c("Different diets", "Same diet"))

mycol<-RColorBrewer::brewer.pal(9,"YlOrBr")[c(7,4)]

dev.new()

pl<-ggplot(data = d, aes(x=Tr, y=rejA))+
  geom_col(aes(fill=Matingdiet))+
  labs(x = "Mating pairs",fill="Male and female from", y = "Proportion of mates rejected")+
  scale_y_continuous(limits=c(0,1),expand = c(0,0))+ 
  scale_fill_manual(values=mycol)+
  theme_bw() + 
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line.y = element_line(colour = "black"),
        axis.text=element_text(size = 10),
        strip.background = element_blank(),
        axis.text.y=element_text(size = 10),
        panel.border=element_blank(),
        panel.spacing.x = unit(1,"line"),
        strip.text.x = element_text(size = 20))+
  geom_hline(yintercept = 0)

pl

如果不想大幅改动原有代码,仅需替换因子转换的代码行即可:

# 将原代码中d$Matingdiet<-factor(d$Matingdiet,levels = rev(levels(d$Matingdiet)))替换为
d$Matingdiet<-factor(d$Matingdiet, levels = rev(unique(d$Matingdiet)))

通用排查步骤

遇到ggplot2映射失效的问题时,可按以下顺序排查:

  • 运行str(d)检查映射变量的类型和取值,确认填充/颜色映射的变量没有NA值、因子水平符合预期
  • 先剥离所有scale_*、theme配置,运行最简绘图代码确认映射是否正常:
ggplot(data = d, aes(x=Tr, y=rejA, fill=Matingdiet)) + geom_col()

如果最简代码能正常输出颜色和图例,说明后续的scale或theme配置存在问题,逐行添加配置排查即可;如果仍为灰色,说明是数据预处理的问题。

内容的提问来源于stack exchange,提问作者Soumya Panyam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:24:03