ggplot设置y轴下限为1时geom_bar不显示、报缺失值问题如何解决
问题根源
你用的geom_bar(stat = "identity")默认以y=0作为柱子的固定基线,每根柱子从y=0向上延伸至给定的mean值。
而你之前使用的ylim()、scale_y_continuous(limits = c(1,7))属于数据过滤式的范围限制:只要图形元素的任意部分不在你设定的取值范围内,ggplot就会直接将整个元素判定为无效并删除。由于所有柱子的底部都落在y=0(远低于你设定的下限1),8根柱子全部被移除,才会出现柱子消失+Removed 8 rows containing missing values的报错。
解决方案
根据你想要的两种不同效果,对应两种改法:
方案1:仅裁切显示范围,保留柱子原始长度(最常用)
如果你只是想让y轴从1开始显示,不需要修改柱子本身的高度,只是把低于1的部分隐藏,把原来的scale_y_continuous(limits = c(1,7))替换成coord_cartesian(ylim = c(1, 7))即可。
原理是coord_cartesian()属于显示层裁剪,不会过滤原始数据,只会把超出显示范围的图形部分隐藏,不会把整根柱子删掉。
修正后的代码:
full %>% ggplot(aes(x = order, y = mean)) + # 修正十六进制颜色缺少#的问题 geom_bar(stat = "identity", fill = "#003900", width = 0.5, position = position_dodge()) + geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = .2, position = position_dodge(.9)) + geom_text(aes(label = round(mean, digits =1)), position = position_dodge(width=1.0), vjust = -4.0, size = 3) + labs(title = "Behavioral intentions in response to each message") + # 用coord_cartesian替代原来的范围设置 coord_cartesian(ylim = c(1, 7)) + # 如需固定显示1-7的刻度可保留,不需要可删除 scale_y_continuous(breaks = seq(1,7,1)) + theme(axis.text = element_text(size = 7)) + xlab("Message") + ylab("Behavioral intentions")
方案2:柱子整体对齐y=1基线(对应你说的柱子向下偏移1单位的效果)
如果你需要柱子的底部刚好对齐y=1的刻度位置,也就是柱子高度对应mean - 1,可以先偏移y轴的映射值,再调整刻度标签对应回原始数值。
修正后的代码:
full %>% # 所有和y相关的映射提前计算偏移量 ggplot(aes(x = order, y = mean - 1)) + geom_bar(stat = "identity", fill = "#003900", width = 0.5, position = position_dodge()) + # 误差棒上下限同步减1 geom_errorbar(aes(ymin = (mean - se) - 1, ymax = (mean + se) - 1), width = .2, position = position_dodge(.9)) + # 文本标签仍显示原始mean值 geom_text(aes(label = round(mean, digits =1)), position = position_dodge(width=1.0), vjust = -4.0, size = 3) + labs(title = "Behavioral intentions in response to each message") + scale_y_continuous( limits = c(0, 6), # 刻度位置对应偏移后的数值,标签对应原始读数 breaks = 0:6, labels = 1:7 ) + theme(axis.text = element_text(size = 7)) + xlab("Message") + ylab("Behavioral intentions")
额外注意
你之前代码里的fill = "003900"缺少十六进制颜色的前缀#,运行时要么会报错要么显示为默认颜色,需要补上。
内容的提问来源于stack exchange,提问作者melbez
相关产品推荐
相关产品推荐

