繁体   English   中英

ggplot2:并排的条形图,一个条堆叠,另一个没有

[英]ggplot2: side by side barplot with one bar stacked and the other not

我正在尝试创建一个条形图,其中为每个类别绘制了两个条形图(并排):一个用于“总计”,另一个用于子组堆叠。 例如,在以下数据框中,“名称”将显示在 x 轴上。 对于 'names' 中的每个类别,一个条形将代表 'total' 的值,另一个将是一个堆叠条形,代表来自 'aaa'、'bbb' 和 'ccc' 的值。 我设法得到了一个“背靠背”的情节,但我不知道如何在这种情况下应用“躲避”位置来并排放置条形图。

df = data.frame(names = rep(LETTERS[1:3], each=4), 
                num = c(rep(c("aaa","bbb","ccc","total"), 3)), 
                values = c(1,2,3,7,2,2,5,10,3,4,2,9)))
p = ggplot(df, aes(x=factor(names))) + 
    geom_bar(data=subset(df,num=="total"), aes(y=values), stat="identity",width=.5) +
    geom_bar(data=subset(df,num!="total"), aes(y=-values,fill=factor(num)), stat="identity",width=.5) 
print(p)

您可以使用分面。 看来你不能同时堆叠和躲避(见下面的相关帖子)。 您可以为 x 变量和名称变量的 facet 的数据添加另一个因素,以得出如下内容:

编辑:调整条的宽度以使条根据评论接触。 请参阅此处: 删除条形 ggplot2 之间的空间

library(ggplot2)
p <- ggplot(data = df, aes(x = place, y = values, colour = num, fill = num))
p <- p + geom_bar(stat = "identity", width = 1, position = "stack")
p <- p + facet_grid(. ~ names)
p

在此处输入图片说明

如果您感兴趣,您似乎可以调整刻面的边距,使 ABC 组看起来更紧密。 有关一些示例,请参阅以下相关帖子:

ggplot2 - 带有堆栈和闪避的条形图

ggplot2 geom_bar position = "dodge" 不闪避

绘制堆积条形图?

添加了“位置”因素的编辑数据:

df <-    structure(list(names = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    num = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 
    3L, 4L), .Label = c("aaa", "bbb", "ccc", "total"), class = "factor"), 
    values = c(1, 2, 3, 7, 2, 2, 5, 10, 3, 4, 2, 9), position = structure(c(1L, 
    1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L), .Label = c("nums", 
    "total"), class = "factor")), .Names = c("names", "num", 
"values", "place"), row.names = c(NA, -12L), class = "data.frame")

您还可以增加条形的宽度以更好地适合图形。 尝试这个:

 p = ggplot(df, aes(x=factor(names)), ) + 
  geom_bar(width=0.75,data=subset(df,num=="total"), aes(y=values), stat="identity",width=.5) +
  geom_bar( width=0.75, data=subset(df,num!="total"), aes(y=-values,fill=factor(num)), stat="identity",width=.5) 
print(p)

新剧情

编辑:

我想我误解了你的问题。 您希望同一个名称中的条形并排排列吗?

我相信自从发布这些答案以来,ggplot2 包已经发生了变化。 我使用的是 R 版本 4.0.2 和 ggplot2 版本 3.3.3。 如果我按照您的要求进行操作,我相信geom_bar函数中的stat='identity'position=position_dodge()参数应该符合您的要求,至少对我来说是这样。

  ggplot(df, aes(names, values, fill=num))+
     geom_bar(stat='identity', position = position_dodge())

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM