如何在ggplot2中阻止geom_vline延伸至x轴下方?
问题:阻止ggplot2中geom_vline延伸至x轴下方

生成上述直方图的代码如下:
library(ggplot2) data(mtcars) ggplot(mtcars, aes(x=mpg)) + geom_vline(aes(xintercept = mean(x = mpg))) + geom_histogram()
我想用这条竖线展示变量的均值,但希望阻止该竖线延伸至x轴下方。尝试过设置coord_cartesian(ylim = c(0, NA)),但并未生效。
补充说明:已知可以用geom_segment和geom_line解决这个问题,但这两个函数需要更多参数,因此希望找到基于geom_vline的解决方案。
解决方案
直接给geom_vline指定ymin和ymax参数,就能限制竖线的绘制范围,避免延伸到x轴下方。核心思路是让竖线从y=0开始,到直方图的最高频数位置结束,具体实现有两种方式:
方式一:提前计算所需数值
library(ggplot2) data(mtcars) # 计算mpg均值和直方图的最大频数 mpg_mean <- mean(mtcars$mpg) # 临时生成直方图获取分组计数,再取最大值 hist_counts <- ggplot_build(ggplot(mtcars, aes(mpg)) + geom_histogram())$data[[1]]$count hist_max <- max(hist_counts) ggplot(mtcars, aes(x=mpg)) + geom_vline(aes(xintercept = mpg_mean), ymin=0, ymax=hist_max) + geom_histogram()
方式二:分步构建绘图对象
library(ggplot2) data(mtcars) # 先创建直方图对象 p <- ggplot(mtcars, aes(x=mpg)) + geom_histogram() # 提取直方图的计数数据 hist_data <- ggplot_build(p)$data[[1]] # 计算mpg均值 mpg_mean <- mean(mtcars$mpg) # 添加限制范围的竖线 p + geom_vline(aes(xintercept = mpg_mean), ymin=0, ymax=max(hist_data$count))
你之前用coord_cartesian(ylim = c(0, NA))无效的原因是:geom_vline默认会贯穿整个绘图区域,不受坐标缩放的限制,而直接指定ymin和ymax是从根源上限制了竖线的绘制范围,因此能解决问题。
内容的提问来源于stack exchange,提问作者braces
相关产品推荐
相关产品推荐

