ggplot使用stat_smooth()不搭配geom_point()时Y轴标签消失问题求助
问题成因
- ggplot2默认会根据所有图层的实际绘制数据的取值范围自动计算坐标轴的显示范围
- 仅调用
stat_smooth(method = "lm")时,图层输出的是拟合直线的坐标点,其y值范围仅覆盖拟合结果的区间,你提供的模拟数据生成的线性拟合线y值落在5~9区间内 - 你自定义的y轴breaks包含1、4两个远小于拟合线y下限的取值,这两个breaks超出了默认的y轴显示范围,ggplot2默认不会渲染超出轴范围的breaks及对应标签,表现为你遇到的自定义Y轴标签被省略的问题
- 当你添加
geom_point()时,图层用到的是原始数据集的全部y值,原始y值范围覆盖了1~10区间,y轴显示范围被扩展到包含所有自定义breaks,因此所有标签正常显示。你使用的透明零大小点的临时方案本质就是引入原始数据的y值范围拉宽坐标轴。
更优雅的解决方案
直接指定y轴的显示范围即可,不需要添加多余的空白图层,有两种常用实现方式:
- 在
scale_y_continuous中添加limits参数,强制y轴覆盖你需要的1~10区间,修改后的代码如下:
ggplot(df, aes(x, y, color = z)) + stat_smooth(method = "lm", formula = "y ~ x", se = FALSE) + scale_y_continuous(breaks = seq(1, 10, length = 4), minor_breaks = c(2, 3, 5, 6, 8, 9), labels = c("1. Fully disaproves", "4", "7", "10. Fully approves"), limits = c(1, 10)) # 新增该行指定y轴范围
- 单独调用
expand_limits函数扩展y轴范围,效果和第一种方案一致:
ggplot(df, aes(x, y, color = z)) + stat_smooth(method = "lm", formula = "y ~ x", se = FALSE) + scale_y_continuous(breaks = seq(1, 10, length = 4), minor_breaks = c(2, 3, 5, 6, 8, 9), labels = c("1. Fully disaproves", "4", "7", "10. Fully approves")) + expand_limits(y = c(1, 10)) # 新增该行扩展y轴范围
内容的提问来源于stack exchange,提问作者Lucas De Abreu Maia
相关产品推荐
相关产品推荐

