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

时间:2016-05-17 15:27:16

标签: r ggplot2 quantile geom-bar

目前,我可以创建一个如下的情节:

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轴上的标签。

1 个答案:

答案 0 :(得分:2)

在城市按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))

enter image description here

你也可以用水平线标记第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)) 

enter image description here