Подтвердить что ты не робот

R с укороченным процентом штрихового графика с процентом двоичного коэффициента и меток (с ggplot)

Я хочу создать графику, которая выглядит примерно так:

enter image description here

Мой исходный набор данных выглядит примерно так:

> bb[sample(nrow(bb), 20), ]
      IMG QUANT FIX
25663   1     1   0
7936    2     2   0
23586   3     2   0
23017   2     2   1
31363   1     3   1
7886    2     2   0
23819   3     3   1
29838   2     2   1
8169    2     3   1
9870    2     3   0
31440   2     1   0
35564   3     1   0
24066   1     2   0
12020   3     2   0
6742    3     2   0
6189    2     3   0
26692   2     3   0
1387    3     2   0
31839   2     3   1
28637   3     2   0

Таким образом, идея заключается в том, что столбцы показывают, где FIX = 1 для фактора QUANT и для фактора IMG.

Я plyr свой набор данных в процентах, используя plyr

library(plyr)
bb.perc <- ddply(bb,.(QUANT,IMG),summarise,FIX.PROP = sum(FIX) / length(FIX))

Это делает почти правильно:

  QUANT IMG   FIX.PROP
1     1   1 0.52439024
2     1   2 0.19085366
3     1   3 0.13658537
4     2   1 0.20414201
5     2   2 0.53964497
6     2   3 0.09585799
7     3   1 0.29000000
8     3   2 0.13000000
9     3   3 0.40705882

Но теперь, если я создаю график, он не учитывает случаи FIX==0, то есть все столбцы имеют одинаковую высоту, а именно 100%, а это не то, что я хочу. Обратите внимание, что отдельные субкадры QUANT не складываются до 100%:

> sum(bb.perc[1:3,]$FIX.PROP)
[1] 0.8518293
> sum(bb.perc[4:6,]$FIX.PROP)
[1] 0.839645
> sum(bb.perc[7:9,]$FIX.PROP)
[1] 0.8270588

Лучшее, что я мог сделать с R, это отобразить счетчики:

# Take only the positive samples
bb.pos <- bb[bb$FIX == 1,]
# Plot the counts
ggplot(bb,aes(factor(QUANT),fill=factor(IMG))) + geom_bar() +
  scale_y_continuous(labels=percent)

И результаты: enter image description here Это тоже не то, что я хочу:

  • Процентная шкала далеко. Мне нужен способ передать точку 100% в функцию percent, но я понятия не имею, как.
  • Не хватает ярлыков.

По SO уже есть много похожих вопросов, но мне, кажется, не хватает достаточного интеллекта (или понимания R), чтобы экстраполировать их на решение моей конкретной проблемы.

Спасибо за любые указатели!

РЕДАКТИРОВАТЬ: Свен Хоэнштейн уже дал ответ, но вот, как я закончил делать это сам:

> ggplot(bb.perc,aes(x=factor(QUANT),y=FIX.PROP,label=paste(round(FIX.PROP*100),
     "%"),fill=factor(IMG)))+ geom_bar(stat="identity") + geom_text(position="stack",
     aes(ymax=1),vjust=5) + scale_y_continuous(labels = percent)

Используя bb.perc который я определил далее, используя plyr. Преимущество этого метода состоит в том, что проценты рассчитываются локально для каждого столбца, а не глобально.

Спасибо всем за помощь. Следующие два вопроса и соответствующие ответы очень помогли мне понять это правильно:

С накоплением гистограммы с ggplot2

Добавление меток на гистограмму ggplot

Сначала я ошибся, geom_bar() параметр position = "fill" в geom_bar(), что по какой-то причине заставило все бары иметь одинаковую высоту!

4b9b3361

Ответ 1

Это способ генерации графика:

ggplot(bb[bb$FIX == 1, ],aes(x = factor(QUANT), fill = factor(IMG), 
                             y = (..count..)/sum(..count..))) +
 geom_bar() +
 stat_bin(geom = "text",
          aes(label = paste(round((..count..)/sum(..count..)*100), "%")),
          vjust = 5) +
 scale_y_continuous(labels = percent)

Измените значение параметра vjust, чтобы отрегулировать вертикальное положение меток.

enter image description here