Я хочу создать графику, которая выглядит примерно так:
Мой исходный набор данных выглядит примерно так:
> 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)
И результаты: Это тоже не то, что я хочу:
- Процентная шкала далеко. Мне нужен способ передать точку 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()
, что по какой-то причине заставило все бары иметь одинаковую высоту!