2014-09-06 2 views
0

Этот вопрос связан с: Grouped, Stacked Barplot Over TimeStacked + увернулся/у barplot в ggplot

Как этот вид barplot (суммированного одной переменной и увернулся от другого) можно в ggplot. Я попытался следующие, но это не сработало:

data1 = cbind(c(1,1.25),c(1.2,1.5),c(.75,1.2)) 
data2 = cbind(c(1.3,1.5),c(1,1.25),c(1.25,.75))  
> data1 
    [,1] [,2] [,3] 
[1,] 1.00 1.2 0.75 
[2,] 1.25 1.5 1.20 
> data2 
    [,1] [,2] [,3] 
[1,] 1.3 1.00 1.25 
[2,] 1.5 1.25 0.75 
> 
> 
> dd1 = data.frame(data1) 
> dd1$id = 'first' 

> dd2 = data.frame(data2) 
> dd2$id = 'second' 

> 
> dd = rbind(dd1, dd2) 
> dd 
    X1 X2 X3  id 
1 1.00 1.20 0.75 first 
2 1.25 1.50 1.20 first 
3 1.30 1.00 1.25 second 
4 1.50 1.25 0.75 second 
> 

> dd$row = c(1,2,1,2) 
> melt(dd, id=c('id','row')) 
     id row variable value 
1 first 1  X1 1.00 
2 first 2  X1 1.25 
3 second 1  X1 1.30 
4 second 2  X1 1.50 
5 first 1  X2 1.20 
6 first 2  X2 1.50 
7 second 1  X2 1.00 
8 second 2  X2 1.25 
9 first 1  X3 0.75 
10 first 2  X3 1.20 
11 second 1  X3 1.25 
12 second 2  X3 0.75 
> 

> 
ggplot(mm)+ 
    geom_bar(data=mm[mm$id=='first',], aes(x=variable, y=value, fill=factor(row)),stat='identity')+ 
    geom_bar(data=mm[mm$id=='second',], aes(x=variable, y=value, fill=factor(row)),stat='identity') 

Но это создает только один столбчатой, а не 2 сложенных баров.

Желательно, чтобы в будущей версии ggplot были стеки = varA, dodge = varB, а не fill = var1, так что один или оба могут быть легко применены.

+1

Я думаю, что вы можете» t есть оба, но [здесь] (http://stackoverflow.com/questions/12715635/ggplot2-bar-plot-with-both-stack-and-dodge) - некоторые альтернативы –

ответ

1

Если я понимаю, что вы пытаетесь сделать, для целей построения можно попробовать изменить значения «переменная» во «втором» наборе данных, чтобы ggplot воспринимал их как разные, но они выглядели одинаково на сюжет. Ваше черчение код будет выглядеть так:

mm$variable <- factor(mm$variable, c(levels(mm$variable), paste(levels(mm$variable)," ")), ordered=TRUE) 
mm$variable[mm$id=="second"] <- paste(mm$variable[mm$id=="second"]," ") 
ggplot(mm)+ 
geom_bar(data=mm, aes(x=variable, y=value, fill=factor(row), colour=id), stat='identity', size= 1.5) + 
scale_colour_manual(values=c(first="black", second="red")) 

Просто для примера, я использовал цвет границы вокруг баров, чтобы отличить первый набор от второго, но вы могли бы сделать что-то другое.

Обновление - На самом деле это проще. Вам нужно будет включить библиотеку сетки, чтобы установить разделение панели.

library(grid) 
ggplot(mm)+ 
geom_bar(data=mm, aes(x=id, y=value, fill=factor(row)), stat='identity', size= 1.3, width=.5) + 
theme(panel.margin.x= unit(0,"cm")) + 
facet_wrap(~ variable, scales = "free_x") 

enter image description here

+0

Это близко к тому, что я хочу, но «X1 »и« X1 »должны быть рядом друг с другом (то же самое для« X2 »и т. д.). Также будет идеально, если между «X1», «X1» и «X2», «X2» есть дополнительное пространство. – rnso

0

возможно это

Layered axes in ggplot?

даст вам представление о том, как решить вашу задачу.

В моем решении вашей стеки = Vara соответствует моему xaxis.inner и ваш додж = varB соответствует моему xaxis.outer

Надеется, что это помогает

Тома

+0

Очень полезная ссылка на ряд решений. Ваше решение достигает того, что нужно, даже если оно длинное. Facet_wrap - самый простой в использовании. – rnso

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