разная ширина для каждого бара, используя geom_bar с "position = fill" в ggplot2 - PullRequest
3 голосов
/ 04 марта 2012

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

Пример: этот сюжет

ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs))) + geom_bar(position="fill")

, а затем сделайте ширину 3 стержней пропорциональной

table(factor(mtcars$cyl))

Хорошо, что параметр "width" в position_fill (), но он должен быть константой, не так ли?

Спасибо,

François

РЕДАКТИРОВАТЬ:

Я попробовал немного дальше, и получил сообщение: "position_fill требует постоянной ширины"

Так что я думаю, получить то, что я пытался получить, невозможно, по крайней мере, с помощью geom_bar.

Ответы [ 2 ]

3 голосов
/ 01 мая 2012

Я могу сделать это, предварительно обработав данные, но не полностью в пределах одного ggplot вызова.

library("plyr")
mt <- ddply(mtcars, .(cyl, vs), summarise, n=length(cyl))
mt <- ddply(mt, .(cyl), mutate, nfrac = n/sum(n), width = sum(n))
mt$width <- mt$width / max(mt$width)

Набор данных mt теперь имеет все необходимое для построения графика:

> mt
  cyl vs  n      nfrac     width
1   4  0  1 0.09090909 0.7857143
2   4  1 10 0.90909091 0.7857143
3   6  0  3 0.42857143 0.5000000
4   6  1  4 0.57142857 0.5000000
5   8  0 14 1.00000000 1.0000000

и вызов ggplot будет выглядеть как

ggplot(mt, aes(x=factor(cyl), fill=factor(vs), y=nfrac)) +
  geom_bar(aes(width=width), position="stack", stat="identity")

Он выдает предупреждение:

Warning message:
position_stack requires constant width: output may be incorrect 

, но создает сюжет:

enter image description here

1 голос
/ 05 марта 2012

Это то, что вы хотите?

library(ggplot2)
ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs))) + geom_bar(position="fill") + coord_flip()

enter image description here

...