目前,我可以创建一个如下的情节:
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轴上的标签。
答案 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))
你也可以用水平线标记第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))