2016-05-17 100 views
1

目前垂直線,我可以創造一個情節像這樣:GGPLOT2如何建立相應的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軸上的標籤。

+2

你能提供與您的代碼運行的樣本數據? – eipi10

回答

1

看起來你需要找到第70個百分點城市的x位置,在城市按y值排序後。下面是內置mtcars數據框的示例。 geom_vline代碼以與我們對條進行排序相同的順序排序mpg(在這種情況下爲y值),然後找到距離第70百分位最近的mpg值的索引。這就是我們想要的垂直線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

+0

非常感謝,這工作完美!額外的問題:用一條垂直線將它分成兩半。在一種情況下,分位數包括它所切的條,而在另一種情況下則不包括。是否有任何直接的方法來移動geom_vline,使它的所有內容都屬於最高x百分位數? – praznin

+1

是的,只需根據需要添加或減去0.5:'geom_vline(xintercept = which.min(abs(sort(mtcars $ mpg,decrease = TRUE) - quantile(mtcars $ mpg,0.7))) - 0.5)'。對於分類x軸,類別每隔一個單位,因此移動0.5會使您處於類別之間的中途。 – eipi10