2015-02-12 4 views
2

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

Я смог достичь этого с помощью приведенного ниже кода, но решение имеет некоторые ограничения. Есть ли другой способ, чем использовать paste0 для оси x? Могу ли я как-то группировать данные на var4, чтобы достичь этого?

dd <- data.frame(date = rep(2001:2005,4), 
       var2=rep(c("a","b","c","d"),each=5), 
       var3=rnorm(20,5), 
       var4=rep(c(1,2),each=10)) 

ggplot(data = dd, aes(x=paste0(date, "/",var4), y=var3, fill=var2)) + 
    geom_bar(stat="identity", position="stack") 

ответ

1

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

ggplot(data = dd, aes(x=date + var4/2 - .75, y=var3, fill=var2)) + 
    geom_bar(stat="identity", position="stack") 

enter image description here

второго один использует грань для создания групп. Это общее, так как вы можете изменить количество групп var4, и это будет автоматически обновляться. Это, однако, в общей сложности хак:

ggplot(data = dd, aes(x=date, y=var3, fill=var2)) + 
    geom_bar(stat="identity", position="stack") + 
    facet_wrap(~ date + var4, scales="free_x", nrow=1) + 
    scale_x_continuous(breaks=dd$date) 

enter image description here

+1

Третий вариант заключается в фасет только по дате и имеют ось х как 'var4'. Ось x не будет иметь дат, но они, по крайней мере, четко видны как заголовки фасет, которые правильно группируют бары. – MattLBeck

+0

Спасибо, решение грань интересно. Но yeap, я надеялся, что 'ggoplot2' может каким-то образом объединить' stack' с 'position_dodge'. – Pepacz

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