使用ggplot2的position_dodge(preserve = 'single')时遇未使用参数错误求助
解决ggplot2中
position_dodge(preserve="single")报错的问题 嘿,这个问题我之前也碰到过!咱们来一步步拆解原因和解决办法:
错误原因
你收到的unused argument (preserve = "single")报错,核心问题是你的ggplot2版本太旧了。preserve参数是在ggplot2 3.0.0版本才正式引入的,而你当前使用的是2.2.1版本,这个版本根本不认识这个参数,所以R会抛出错误。同时你的R版本3.4.1也比较老旧,它和新版本的ggplot2存在兼容性问题,没法直接安装高版本的ggplot2。
解决建议
方案1:升级R和ggplot2(推荐)
这是一劳永逸的办法:
- 先把你的R版本升级到最新的稳定版(比如4.x系列),旧版R(3.4.1)已经停止维护很久了,升级后不仅能解决这个问题,还能使用更多新功能。
- R升级完成后,重新安装ggplot2:
安装完成后,再运行你的原代码,install.packages("ggplot2")position_dodge(preserve = "single")就能正常工作了。
方案2:不升级R,用替代方法实现相同效果
如果暂时没法升级R,你可以手动补全数据中缺失的分组,让每个cyl类别都包含vs的两个取值(哪怕计数为0),这样普通的position_dodge()就能实现柱子宽度一致的效果:
# 加载需要的包 library(dplyr) library(tidyr) library(ggplot2) # 补全所有cyl和vs的组合,缺失的组计数设为0 mtcars_full <- mtcars %>% mutate(cyl = factor(cyl), vs = factor(vs)) %>% group_by(cyl, vs) %>% summarise(count = n(), .groups = "drop") %>% complete(cyl, vs, fill = list(count = 0)) # 绘图 ggplot(mtcars_full, aes(x = cyl, y = count, fill = vs)) + geom_bar(stat = "identity", position = position_dodge())
这样出来的图,和使用preserve="single"的效果是一致的——所有柱子宽度相同,不会因为某个组只有一个类别就变宽。
内容的提问来源于stack exchange,提问作者SubstantiaN
相关产品推荐
相关产品推荐

