ggplot2应用theme_bw()后geom_pointrange元素消失如何保留?
问题原因与解决方案
你遇到的问题核心是绘图对象赋值逻辑错误,和theme_bw()本身无关联:
你原代码中p + stat_summary(...)仅临时生成了带点范围线的绘图结果,但没有将这个新对象赋值回p变量,你后续调用的p仍然只包含初始的geom_dotplot图层,所以追加主题时自然看不到pointrange元素。
修正后可运行代码
library(ggplot2) mtcars$cyl = as.factor(mtcars$cyl) mtcars$vs = as.factor(mtcars$vs) # 方式1:逐图层赋值,适合后续复用绘图对象 p <- ggplot(mtcars, aes(x=cyl, y=mpg, fill = vs)) + geom_dotplot(binaxis='y', binwidth = 1, stackdir='center', dotsize = .5, alpha = .5, position=position_dodge(0.25)) # 将stat_summary生成的图层追加后重新赋值给p p <- p + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="pointrange", # 注:原color向量长度为5,匹配3个cyl水平*2个vs水平共6个分组时会自动循环,可根据需求调整长度 color=c("black", "red", "black", "red", "black", "red"), size = 1, show.legend = F, position=position_dodge(0.25)) # 追加主题后直接输出,此时会包含所有图层 p + theme_bw() # 方式2:一次性链式调用,更不易出现赋值遗漏问题 ggplot(mtcars, aes(x=cyl, y=mpg, fill = vs)) + geom_dotplot(binaxis='y', binwidth = 1, stackdir='center', dotsize = .5, alpha = .5, position=position_dodge(0.25)) + stat_summary(fun.data=mean_sdl, fun.args = list(mult=1), geom="pointrange", color=c("black", "red", "black", "red", "black", "red"), size = 1, show.legend = F, position=position_dodge(0.25)) + theme_bw()
小提示:如果需要保留带pointrange的基础绘图对象复用,务必将新增图层的结果赋值回原变量,避免临时计算结果丢失。
内容的提问来源于stack exchange,提问作者KWC
相关产品推荐
相关产品推荐

