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")

Но тогда, конечно, вертикальная линия пересекает точку x в 41-м городе, а не там, где значение y равно 41,265. Этого я не хочу. Как мне расположить линию так, чтобы она соответствовала городу, имеющему значение 70-го процентиля, вместо того, чтобы создавать вертикальную линию в неправильном месте?

Мой фрейм данных содержит один столбец со значениями для аварий, а города заданы как имена строк, которые я продублировал в новый столбец, чтобы их можно было использовать в качестве меток на оси x.


person praznin    schedule 17.05.2016    source источник
comment
Можете ли вы предоставить образцы данных, которые работают с вашим кодом?   -  person eipi10    schedule 17.05.2016


Ответы (1)


Похоже, вам нужно найти x-позицию города 70-го процентиля после того, как города были упорядочены по их значению y. Вот пример этого со встроенным фреймом данных 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)) 

введите описание изображения здесь

person eipi10    schedule 17.05.2016
comment
Большое спасибо, это сработало отлично! Дополнительный вопрос: вертикальной линией он разделяет планку пополам. В одном случае квантиль включает в себя отрезанную полосу, а в другом - нет. Есть ли какой-нибудь простой способ сдвинуть geom_vline так, чтобы все, что осталось от него, принадлежало верхнему процентилю x? - person praznin; 17.05.2016
comment
Да, просто добавьте или вычтите 0,5 по мере необходимости: geom_vline(xintercept = which.min(abs(sort(mtcars$mpg,decreasing=TRUE) - quantile(mtcars$mpg,0.7))) - 0.5). Для категориальной оси X каждая категория разделена на одну единицу, поэтому сдвиг на 0,5 помещает вас на полпути между категориями. - person eipi10; 17.05.2016