2016-05-17 2 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-м города, вместо того, где значение у является 41,265. Это не то, что я хочу. Как поместить линию, чтобы соответствовать городу, который имеет значение 70-го процентиля, вместо того, чтобы создавать вертикальную линию в неправильном месте?

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

+2

Можете ли вы предоставить образец данных, который работает с кодом? – eipi10

ответ

1

Похоже, вам нужно найти x-положение 70-го процентиля города после того, как города были заказаны по их значению y. Вот пример этого со встроенным фреймом данных mtcars. Код geom_vline сортирует mpg (значение y в этом случае) в том же порядке, что и мы отсортировали бары, а затем обнаружил индекс значения mpg, который находится ближе всего к 70-му процентилю. Это х-позиция, где мы хотим, чтобы вертикальная линию:

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, убывающий = TRUE) - quantile (mtcars $ mpg, 0.7))) - 0.5)'. Для категориальной оси x категории разделяются на одну единицу, поэтому сдвиг на 0,5 ставит вас на полпути между категориями. – eipi10

Смежные вопросы