【问题标题】:How to plot grouped and stacked subset plot in R如何在 R 中绘制分组和堆叠子集图
【发布时间】:2015-09-24 08:49:29
【问题描述】:

我有一个包含如下数据的文件:

  test  <- data.frame(Group=c("A", "B", "C", "D", "E"), 
                value1=c(100,150,120,80,150),     
                value2=c(25,30,45,30,30) , 
                value3=c(100,120,150,150,200),
                value4=c(30,45,65,45,30)) 

我想为每个“组”创建一个分组条形图,其中 value1 和 value2 堆叠成 1 个条形图,value3 和值 4 堆叠成另一个条形图。

P:S:Value2 应该是 value1 的子集,而 Value4 应该是 bar 中 value3 的子集。

在R中可能吗?

【问题讨论】:

  • 从大多数关于分组和堆叠图表的问题来看,herehere too 看起来facet_grid 是要走的路。有人确实使用了数据操作,但我不确定它会如何应用在这里this question。希望对您有所帮助。
  • 我查看了这些,但看起来与我需要的略有不同。在这里,我有一对柱子,每对柱子都必须堆叠成一个条形。
  • 是的,我明白您在寻找什么。唯一的方法是要么使用 facet_grid,要么放弃 5 个组,将它们变成 10 个组,正如 Herka 好心演示的那样。
  • 我还是没明白你的意思。我使用了 facet_grid,它给出了 Herka 给出的第二个图。但是,堆栈中的值存在于另一个之上,但不在最大值的范围内。
  • 从值 1 中减去值 2。在第一个示例中是 100 - 25。得到 75。如果将 75 和 25 叠加,您将获得所需的输出

标签: r ggplot2


【解决方案1】:

我们需要先进行一些数据整形,因为每个点都需要在其自己的行上与其关联的所有信息。

library(reshape2)
library(ggplot2)
m_test <- melt(test,id.var="Group")

#generate a grouping variable to separate the two bars.
#currently done by comparing variable names.
m_test$subvar <- as.numeric(m_test$variable %in% c("value3","value4"))

test2 <- dcast(Group+subvar+variable~"value",value.var="value",data=m_test)
#reverse for proper plotting
test2 <- test2[rev(order(test2$variable)),]
> head(test2)
   Group subvar variable value
20     E      1   value4    30
16     D      1   value4    45
12     C      1   value4    65
8      B      1   value4    45
4      A      1   value4    30
19     E      1   value3   200

然后我们可以像这样绘制:

p1 <- ggplot(test2, aes(x=interaction(subvar,Group),y=value,fill=variable))+
  geom_bar(stat="identity")
p1

或者使用构面:

p2 <- ggplot(test2, aes(x=factor(subvar),y=value, fill=variable))+
  geom_bar(stat="identity")+facet_grid(.~Group)
p2

【讨论】:

  • 它看起来几乎可以工作了。但是,例如在第一个堆叠柱中,value1 是 100,value 2 是 25。堆栈中的总值应该是 100,25 应该在 100 内表示。目前,它显示 25 和 100,总计 125。跨度>
  • @chas 在你的问题中,当你说“应该是的一个子集”时,不清楚预期的结果是什么。 “value 1”需要是数据中的“value1 - value2”。
  • 为简单起见,值 2 应表示为 value1 内的值。即在这种情况下 value2 是 25 而 value1 是 100,所以底部值 25 应该代表 value2 而顶部值直到 100 应该代表 value1
  • 这意味着值 2 是 25,值 1 是 75。所以你应该做的是从值 1 中减去值 2 并按上面的方式绘制。
  • 我知道如何使它工作。如果我有更多变量,即值 5 和值 6、值 7 和值 8,是否可以扩展代码?看起来它与代码中的 'm_test$subvar
【解决方案2】:

我发现我需要重写你的输入数据如下,

test  <- data.frame(Group=c("A", "B", "C", "D", "E"), 
                    value1=c(100,150,120,80,150),     
                    value2=c(25,30,45,30,30) , 
                    value3=c(100,120,150,150,200),
                    value4=c(30,45,65,45,30), stringsAsFactors=F)

注意 stringsAsFactors=F 参数。

我从下面得到了你想要的(我认为),

barplot(as.matrix(t(test[,-1])), names.arg=test[,1])

你需要玩弄颜色和标签。

【讨论】:

  • 不。对于每个组,我需要一个用于 value1 和 value2 的堆积条,另一个用于 value3 和 value4 的堆积条。
  • @chas 我不确定你的意思,但我明白你的意思:你只能通过让代码向我们展示来告诉我们。
  • 我正在使用 'stackoverflow.com/questions/18774632/…' 处的代码,其中包含三个值,其中值 2 和值 3 堆叠在一起。在我的情况下,我有 4 个值,其中值 1 和值 2 应该堆叠到 1 个条中,值 3 和值 4 应该堆叠到 1 个条中。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2018-02-06
相关资源
最近更新 更多