R语言线性趋势与置信区间绘图纵轴出现负值问题求助
ggplot2纵轴出现异常负值的解决方法
问题重现代码
ggplot(correlation, aes(x=area_ha, y=extent_2000_ha)) + geom_point( color="green") + theme_ipsum() + theme(text=element_text(family="Times New Roman", size=14)) + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + scale_y_continuous(labels=scales::comma) + geom_smooth(method=lm, color="red", se=FALSE)
问题说明
使用上述代码绘制图表时,添加线性趋势线及置信区间后,纵轴出现了负值(如-200000),但所有原始数据的extent_2000_ha值均为正值。
原因分析
- 代码中重复调用
scale_y_continuous,后一次调用会覆盖前一次设置,导致轴范围控制逻辑混乱。 - ggplot2默认会扩展坐标轴范围以包含所有绘图元素,包括线性回归的置信区间或趋势线延伸部分,当回归模型的预测区间向下延伸至负值时,纵轴就会显示负值。
修正方案
方案1:合并轴设置并限制纵轴下限为0
将重复的scale_y_continuous合并,同时强制纵轴从0开始:
ggplot(correlation, aes(x=area_ha, y=extent_2000_ha)) + geom_point(color="green") + theme_ipsum() + theme(text=element_text(family="Times New Roman", size=14)) + scale_y_continuous( labels=scales::comma, # 保留逗号格式的数值标签 limits=c(0, NA), # 纵轴下限设为0,上限自动适配数据最大值 expand=expansion(mult=c(0, 0.05)) # 可选:让顶部留有少量空白,避免数据点紧贴坐标轴 ) + geom_smooth(method=lm, color="red", se=TRUE) # 开启置信区间显示
方案2:视觉裁剪坐标轴(不影响回归计算)
如果需要保留完整的回归模型计算,仅通过视觉方式隐藏负值区间,可使用coord_cartesian进行裁剪:
ggplot(correlation, aes(x=area_ha, y=extent_2000_ha)) + geom_point(color="green") + theme_ipsum() + theme(text=element_text(family="Times New Roman", size=14)) + scale_y_continuous(labels=scales::comma) + geom_smooth(method=lm, color="red", se=TRUE) + coord_cartesian(ylim=c(0, NA)) # 仅视觉上限制纵轴下限为0
内容的提问来源于stack exchange,提问作者Ana-Maria
相关产品推荐
相关产品推荐

