R ggplot2:并排条形图,其中一条堆叠,另一条未堆叠

R ggplot2:并排条形图,其中一条堆叠,另一条未堆叠,r,ggplot2,bar-chart,R,Ggplot2,Bar Chart,我试图创建一个条形图,其中每个类别有两个条形图(并排):一个用于“总计”,另一个按子组堆叠。例如,在以下数据框中,“名称”将显示在x轴上。对于“名称”中的每个类别,一条表示“总计”的值,另一条表示“aaa”、“bbb”和“ccc”中的值。我设法得到了一个“背对背”的情节,但我不知道如何将“道奇”的位置应用到这个案例中,使酒吧并排 df = data.frame(names = rep(LETTERS[1:3], each=4), num = c(rep(c("a

我试图创建一个条形图,其中每个类别有两个条形图(并排):一个用于“总计”,另一个按子组堆叠。例如,在以下数据框中,“名称”将显示在x轴上。对于“名称”中的每个类别,一条表示“总计”的值,另一条表示“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)

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

 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)

编辑:


我想我误解了你的问题。是否希望一个名称中的条并排排列?

可以使用镶嵌面。看起来你不能同时堆叠和闪避(参见下面的相关帖子)。您可以为x变量和names变量上的facet向数据中添加另一个因子,得出如下结果:

编辑:根据注释调整条的宽度,使条接触。请参见此处:

库(ggplot2)

p我相信自从这些答案发布后,ggplot2软件包发生了变化。我使用的是R版本4.0.2和ggplot2版本3.3.3。如果我遵循您的要求,我相信
stat='identity'
position=position\u dodge()
函数中的
geom\u bar
参数应该符合您的要求,至少对我来说是这样

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

您是否试图绘制一个图,其中子组和总条是相邻的,或者,正如您在迄今为止的文章中所描述的那样,是背靠背的?我希望它们彼此相邻…背靠背是我现在可以得到的(不使用面)…很抱歉混淆…是的..我想要类似LJW生成的绘图,如下所示,但我不想使用facet..据他说,stack和dodge似乎不能一起完成…不确定你是否知道如何完成..谢谢!很高兴知道这个技巧,但我确实希望“nums”和“total”的栏显示得尽可能接近。如果它是不可能做道奇和堆栈在一起,我一定会使用这个替代方案。谢谢这看起来很棒!谢谢
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")
  ggplot(df, aes(names, values, fill=num))+
     geom_bar(stat='identity', position = position_dodge())