此问题与:Grouped, Stacked Barplot Over Time
有关如何在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的未来版本有stack = varA,dodge = varB选项而不是fill = var1,这样可以轻松应用其中一个或两个。
答案 0 :(得分: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")
答案 1 :(得分:0)
也许这个
会让您了解如何解决您的任务。
在我的解决方案中你的 stack = varA对应于我的xaxis.inner和你的 dodge = varB对应于我的xaxis.outer
希望这有帮助
汤姆