2016-05-07 2 views
3

У меня есть данные, что говорит мне, сколько минут потребовалось, чтобы решить поставленную задачу:гистограмма плотности в ggplot2: этикетка высота бар

dat = data.frame(a = c(5.5,7,4,20,4.75,6,5,8.5,10,10.5,13.5,14,11)) 

Я построена гистограмма плотности данных с пакетом ggplot2:

p=ggplot(dat, aes(x=a)) + geom_histogram(aes(y=..density..),breaks = seq(4,20,by=2))+xlab("Required Solving Time") 

Теперь я хотел бы добавить ярлыки высоты каждой панели плотности поверх нее. Я попытался достичь этого , добавив +geom_text(label=..density..). Это возвращает ошибку

объект '..density ..' не найден

однако. Кто-нибудь знает, что вход функции geom_text() имеет , чтобы быть в моем случае, чтобы получить эти ярлыки?

Решение без geom_text() тоже хорошо, но я предпочел бы, чтобы оставался в пакете ggplot2.

+2

Это вы после? http://stackoverflow.com/questions/24198896/how-to-get-data-labels-for-a-histogram-in-ggplot2/24199013#24199013 – MrFlick

+0

Да, я видел этот ответ, когда я искал stackoverflow, но в моем случае это гистограмма плотности, а не абсолютные полосы частот. Я не смог найти решение моей проблемы из этого ответа ... – Alias

ответ

2

Вы можете сделать это с ggplot_build():

library(ggplot2) 
dat = data.frame(a = c(5.5,7,4,20,4.75,6,5,8.5,10,10.5,13.5,14,11)) 
p=ggplot(dat, aes(x=a)) + 
    geom_histogram(aes(y=..density..),breaks = seq(4,20,by=2))+xlab("Required Solving Time") 

ggplot_build(p)$data 
#[[1]] 
#   y count x xmin xmax density ncount ndensity PANEL group ymin  ymax colour fill size linetype alpha 
#1 0.19230769  5 5 4 6 0.19230769 1.0  26.0  1 -1 0 0.19230769  NA grey35 0.5  1 NA 
#2 0.03846154  1 7 6 8 0.03846154 0.2  5.2  1 -1 0 0.03846154  NA grey35 0.5  1 NA 
#3 0.07692308  2 9 8 10 0.07692308 0.4  10.4  1 -1 0 0.07692308  NA grey35 0.5  1 NA 
#4 0.07692308  2 11 10 12 0.07692308 0.4  10.4  1 -1 0 0.07692308  NA grey35 0.5  1 NA 
#5 0.07692308  2 13 12 14 0.07692308 0.4  10.4  1 -1 0 0.07692308  NA grey35 0.5  1 NA 
#6 0.00000000  0 15 14 16 0.00000000 0.0  0.0  1 -1 0 0.00000000  NA grey35 0.5  1 NA 
#7 0.00000000  0 17 16 18 0.00000000 0.0  0.0  1 -1 0 0.00000000  NA grey35 0.5  1 NA 
#8 0.03846154  1 19 18 20 0.03846154 0.2  5.2  1 -1 0 0.03846154  NA grey35 0.5  1 NA 


p + geom_text(data = as.data.frame(ggplot_build(p)$data), 
       aes(x=x, y= density , label = round(density,2)), 
       nudge_y = 0.005) 
+1

В комментариях к [этому вопросу] (http://stackoverflow.com/questions/20622332/documentation-on-internal-variables-in -ggplot-esp-panel) Хэдли «настоятельно советует [s] против« использования внутренних переменных, таких как PANEL, которые я рассматриваю как один из столбцов в ggplot_build(). Являются ли другие переменные в ggpplot_build() здесь как плотность, которую считают более безопасной? –

+1

Или, может быть, ggplot_build (p) $ data $ PANEL не является «внутренней» ПАНЕЛЬю и безопасна в использовании? [Документы] (https://www.rdocumentation.org/packages/ggplot2/versions/2.1.0/themes/print.ggplot?) Кажется, что ggplot_build() должен быть таким же надежным, как и все, так как он возвращается (невидимо) print.ggplot. И предупреждение Хэдли о том, что я ссылаюсь на выше, - с 2013 года ... –

4

Вы можете маркировать слитках, используя stat_bin с geom="text". stat_bin вычисляет подсчеты, которые мы преобразуем в плотности, используя ..density.., как и для geom_histogram. Но, установив geom="text", мы отображаем эти значения плотности как текст. Нам также необходимо установить тот же breaks для geom_histogram и stat_bin, чтобы значения плотности совпадали. Я поместил текстовые метки в середину полосы, умножив ..density.. на 0.5 в метке. Тем не менее, вы можете, конечно, настроить это, как вам угодно.

breaks = seq(4,20,by=2) 

ggplot(dat, aes(x=a)) + 
    geom_histogram(aes(y=..density..), breaks = breaks) + 
    stat_bin(geom="text", aes(label=round(..density..,2), y=0.5*..density..), 
      breaks=breaks, colour="white") + 
    xlab("Required Solving Time") 

enter image description here

Чтобы получить метки над решеткой, вы можете использовать:

ggplot(dat, aes(x=a)) + 
    geom_histogram(aes(y=..density..), breaks = breaks) + 
    stat_bin(geom="text", aes(label=round(..density..,2), y=..density..), 
      breaks=breaks, vjust = -1) + 
    xlab("Required Solving Time") 

enter image description here

4

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

p + geom_text(aes(label=round(..density.., 2), y=..density..), 
       stat="bin", breaks = seq(4,20,by=2), 
       col="white", vjust=1) 

enter image description here