You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:50:25