【问题标题】:Stacked+dodged/beside barplot in ggplotggplot中的堆叠+闪避/旁边的条形图
【发布时间】:2014-10-31 03:16:16
【问题描述】:

此问题与: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,以便可以轻松应用其中一个或两个。

【问题讨论】:

  • 我认为你不能两者兼得,但here 是一些替代品

标签: r ggplot2


【解决方案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")

【讨论】:

  • 它与我想要的很接近,但“X1”和“X1”需要彼此相邻(“X2”等相同)。如果在“X1”,“X1”和“X2”,“X2”之间有一些额外的空间,那将是完美的。
【解决方案2】:

也许是这个

Layered axes in ggplot?

会告诉你如何解决你的任务。

在我的解决方案中 stack = varA 对应于我的 xaxis.inner 和你的 dodge = varB 对应我的 xaxis.outer

希望对你有帮助

汤姆

【讨论】:

  • 非常有用的链接,包含许多解决方案。即使它很长,您的解决方案也能达到所需的效果。 Facet_wrap 是最简单易用的。
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2018-04-01
相关资源
最近更新 更多