如何移除ggplot中默认连接x轴与密度线的黑色实线?
关于ggplot绘制均匀分布图像的两个问题
我用ggplot绘制了区间(10,30)的均匀分布图像,代码如下:
a <- 10 b <- 30 ggplot(data.frame(x = c(a,b)), aes(x = x)) + stat_function(fun = dunif, args = list(min = a, max = b)) + theme_bw() + labs(x = "x", y = "f(x)", title = "Uniform Distribution (10,30)") + theme(plot.title = element_text(hjust = 0.5)) + geom_segment(x=10, y=0, xend=10, yend=.05, lty = 'dotted') + geom_segment(x=30, y=0, xend=30, yend=.05, lty = 'dotted') + geom_segment(x=20, y=0, xend=20, yend=.05, lty = 'dashed', colour = 'blue') + geom_segment(x=(20+20/3*sqrt(3)), y=0, xend=(20+20/3*sqrt(3)), yend=.05, lty = 'dashed', colour = 'red') + geom_segment(x=(20-20/3*sqrt(3)), y=0, xend=(20-20/3*sqrt(3)), yend=.05, lty = 'dashed', colour = 'red') + xlim(5,35)
现在有两个问题:
- 想移除图中默认连接x轴与顶部密度线的黑色实线
- 添加的geom_segment线段看起来没有和x轴垂直
解决方案
1. 移除默认连接x轴的黑色实线
stat_function默认使用geom="path",会自动把函数曲线的端点和x轴连接起来。只需将geom参数改为"line",就只会绘制函数本身的水平线:
stat_function(fun = dunif, args = list(min = a, max = b), geom = "line")
2. 让线段垂直于x轴
geom_segment看起来不垂直,是因为ggplot的x轴和y轴显示比例不一致(单位长度对应的像素不同)。有两种解决办法:
- 更简单的方法:用geom_vline替代geom_segment
geom_vline是专门用来绘制垂直于x轴的直线,不管坐标轴比例如何,都会显示垂直。修改后的线段代码如下:geom_vline(xintercept = 10, lty = 'dotted', ymax = 0.05, ymin = 0) + geom_vline(xintercept = 30, lty = 'dotted', ymax = 0.05, ymin = 0) + geom_vline(xintercept = 20, lty = 'dashed', colour = 'blue', ymax = 0.05, ymin = 0) + geom_vline(xintercept = (20+20/3*sqrt(3)), lty = 'dashed', colour = 'red', ymax = 0.05, ymin = 0) + geom_vline(xintercept = (20-20/3*sqrt(3)), lty = 'dashed', colour = 'red', ymax = 0.05, ymin = 0) - 保留geom_segment的方法:固定坐标轴比例
添加coord_fixed(ratio = (35-5)/0.05),让x轴范围(5-35)和y轴范围(0-0.05)的显示比例匹配,这样线段就会看起来垂直。
修改后的完整代码
a <- 10 b <- 30 ggplot(data.frame(x = c(a,b)), aes(x = x)) + stat_function(fun = dunif, args = list(min = a, max = b), geom = "line") + theme_bw() + labs(x = "x", y = "f(x)", title = "Uniform Distribution (10,30)") + theme(plot.title = element_text(hjust = 0.5)) + geom_vline(xintercept = 10, lty = 'dotted', ymax = 0.05, ymin = 0) + geom_vline(xintercept = 30, lty = 'dotted', ymax = 0.05, ymin = 0) + geom_vline(xintercept = 20, lty = 'dashed', colour = 'blue', ymax = 0.05, ymin = 0) + geom_vline(xintercept = (20+20/3*sqrt(3)), lty = 'dashed', colour = 'red', ymax = 0.05, ymin = 0) + geom_vline(xintercept = (20-20/3*sqrt(3)), lty = 'dashed', colour = 'red', ymax = 0.05, ymin = 0) + xlim(5,35)
内容的提问来源于stack exchange,提问作者MOHAMMED
相关产品推荐
相关产品推荐

