升级R与ggplot2后所有ggplot图形呈灰色无填充色如何解决
问题根因
R 4.0.0及以上版本中,as.data.frame()的stringsAsFactors参数默认值从TRUE调整为FALSE,你原代码的数据预处理步骤存在逻辑漏洞,在新版本R下运行会导致填充映射变量失效:
- 你使用
cbind(Tr,rejA,Matingdiet)拼接变量时,会自动将所有变量强制转换为字符型,再转数据框后d$Matingdiet为字符型,本身没有levels属性 - 后续执行
d$Matingdiet<-factor(d$Matingdiet,levels = rev(levels(d$Matingdiet)))时,levels(d$Matingdiet)返回NULL,最终会将d$Matingdiet转换为所有值为NA的因子 - 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
相关产品推荐
相关产品推荐

