2016-11-16 19 views
1

我想添加一个堆积条到闪躲的条形图,显示总数。我不希望总数的列成为实心条,而是由堆叠的组件组成。 我可以将两个geom_bars添加到该图中,但我无法移动总栏。我可以在中间添加一个虚拟类别为零,但当然我更希望总数位于组件的右侧。闪回的条形图与堆栈总数

df=data.frame(
    treatment=rep(c("Impact","Control")), 
    type=rep(c("Phylum1","Phylum2"),each=2), 
    total=c(2,3,4,5)) 

ggplot(df,aes(y=total,x=treatment,fill=type)) + 
    geom_bar(position= position_dodge(),stat="identity", alpha = 0.9, width = 0.25) + 
    geom_bar(position = position_stack(), stat = 'identity', alpha = 0.3, width = 0.125) 

not precisely what I want

This是不是他们想要的堆栈/由两个变量闪避同样的问题。我只是想总结相同的信息两次,但不同。

我当然可以为实心总量添加一个条,并手动放入堆积条中,但是我基本的ggplot非常接近,以至于我认为可能有点破解(例如修改position_stack的返回对象)可能会可能。

+0

[这](https://stackoverflow.com/questions/30021410/ggplot2-side-by-side-barplot-with-one-bar-stacked-and-the-other -not?noredirect = 1&lq = 1)可能是相关的,但我认为你必须重塑你的数据集。 – aosmith

+0

@aosmith是的,我看到了,应该把它链接起来。这基本上与我想要的相反(在堆栈旁边闪避一个稳定的总数,而我想将叠加的总数放在闪避的组件旁边)。 – Ruben

+0

我不确定我了解你的情节。对于每个“治疗”,每个“类型”有两个值,但只能看到图中每个组合的最大值。那是你要的吗? – aosmith

回答

3

您可以重塑您的数据集并使用构面来获得效果,但这会显示所有数据,而不仅仅是每个type/treatment组合中的最大值。

您的数据集将需要重复两次,一次为原始type,一次用于绘制总数。您还需要一个新变量,我称之为type2

df$type2 = df$type 
df2 = df 
df2$type2 = "Total" 

堆栈的两个数据集经由rbind在一起,然后绘制使用type2作为变量x和α变量。

ggplot(rbind(df, df2), aes(y = total, x = type2, fill = type, alpha = type2)) + 
    geom_col(width = .9) + 
    facet_wrap(~treatment, strip.position = "bottom") + 
    scale_alpha_manual(values = c(.9, .9, .3), guide = "none") + 
    theme(strip.background = element_blank(), 
      axis.text.x = element_blank(), 
      axis.ticks.length = unit(0, "mm"), 
      panel.spacing = unit(0, "mm"), 
      panel.grid.major.x = element_blank()) + 
    scale_x_discrete(expand = c(1, 0)) 

enter image description here

+0

谢谢,只是使用第二个分组var并将它堆叠起来很有意义,我明天将在工作中尝试它。阿尔法的东西只是为了展示它如何与我的方法叠加。 – Ruben

+1

毕竟试图在家里。它效果很好。一个小小的改进:如果你想让酒吧从左到右堆叠从底部到顶部,可以颠倒'type'因子的顺序。 – Ruben

+0

对不起,我删除了关于facet_wrap条方向的评论。我想到了。我认为角度是相对于默认角度,原来它是绝对的。所以'angle = 180'就是我在小面条左边时需要的。 – Ruben