ggplot2 如何在 geom_bar 图中创建对应于分位数的垂直线

ggplot2 How to create vertical line corresponding to quantile in geom_bar plot

目前,我可以创建这样的情节:

geom_bar

ggplot(df.Acc, aes(x = reorder(cities, -accidents), y = accidents)) +
geom_bar(stat = "identity", fill="steelblue", alpha=0.75) + 
geom_hline(yintercept=0, size=0.4, color="black")

这是一个图表,比方说,y 轴是每年的自行车事故数量,x 轴是城市名称。

我想添加一条垂直线来分隔第 70 个百分位以上和以下的所有城市。

所以我试过

> vlinAcc <- quantile(df.Cities$accidents, .70)
> vlinAcc
     70% 
41.26589 

这看起来不错,所有事故值超过 41 的城市都在 70% 以上。

但是,我不知道如何将其添加到图表中。我试过:

+ geom_vline(xintercept=vlinAcc, size=0.4, color="black")

但是,当然,垂直线在第 41 个城市截取 x,而不是在 y 值为 41.265 的地方截取。这不是我想要的。如何定位线以对应具有第 70 个百分位值的城市,而不是在错误的位置创建垂直线?

我的数据框包含一个包含事故值的列,城市被设置为行名称,我将其复制到一个新列中,以便可以将它们用作 x 轴上的标签。

在城市按 y 值排序后,您似乎需要找到第 70 个百分位城市的 x 位置。这是内置 mtcars 数据框的示例。 geom_vline 代码按照我们对条形图排序的相同顺序对 mpg(本例中的 y 值)进行排序,然后找到最接近的 mpg 值的索引第 70 个百分位数。这是我们想要垂直线的 x 位置:

mtcars$model = rownames(mtcars)

ggplot(mtcars, aes(reorder(model, -mpg), mpg )) + 
  geom_bar(stat="identity", fill="lightblue") +
  theme_bw() +
  geom_vline(xintercept = which.min(abs(sort(mtcars$mpg,decreasing=TRUE) - quantile(mtcars$mpg,0.7)))) +
  theme(axis.text.x=element_text(angle=-90, vjust=0.5,hjust=0))

您也可以用水平线标记第 70 个百分位,这可能更能说明问题。

ggplot(mtcars, aes(reorder(model, -mpg), mpg )) + 
  geom_bar(stat="identity", fill="lightblue") +
  theme_bw() +
  geom_hline(yintercept = quantile(mtcars$mpg, .7), lty=2) +
  theme(axis.text.x=element_text(angle=-90, vjust=0.5,hjust=0))