ggplot2:使用组表示堆栈条形图

时间:2015-08-28 14:37:51

标签: r ggplot2

我已经尝试过几个方法来制作ggplot绘图条形图,其中包含从数据框中的因子派生的方法,但我没有成功。 如果你考虑:

df <- as.data.frame(matrix(rnorm(60*2, mean=3,sd=1), 60, 2))
df$factor <- c(rep(factor(1:3), each=20))

我想要实现这样一个堆叠的相对条形图: enter image description here

此图表是通过在单独的数据框中手动计算组平均值,使用geom_bar(stat="identity", position = "fill)scale_y_continuous(labels = percent_format())将其融合而创建的。我还没有找到一种方法来将stat_summary与堆积的条形图一起使用。

在第二步中,我希望将错误栏附加到每列的中断处。我有六种治疗方法和三种,所以错误栏应该没问题。

1 个答案:

答案 0 :(得分:2)

对于任何复杂的事情,我认为它更容易预先计算数字,然后绘制它们。这很容易使用dplyr / tidyr(甚至是误差条):

gather(df, 'cat', 'value', 1:2) %>% 
    group_by(factor, cat) %>% 
    summarise(mean=mean(value), se=sd(value)/sqrt(n())) %>% 
    group_by(cat) %>% 
    mutate(perc=mean/sum(mean), ymin=cumsum(perc) -se/sum(mean), ymax=cumsum(perc) + se/sum(mean)) %>% 
    ggplot(aes(x=cat, y=perc, fill=factor(factor))) +
        geom_bar(stat='identity') +
        geom_errorbar(aes(ymax=ymax, ymin=ymin))

enter image description here

当然这看起来有点奇怪,因为堆叠条中的误差条约为100%。我认为你最好不要绘制实际的数据点,加上平均值和误差条以及使用刻面:

gather(df, 'cat', 'value', 1:2) %>% 
    group_by(cat, factor) %>% 
    summarise(mean=mean(value), se=sd(value)/sqrt(n())) %>% 
    ggplot(aes(x=cat, y=mean, colour=factor(factor))) +
        geom_point(aes(y=value), position=position_jitter(width=.3, height=0), data=gather(df, 'cat', 'value', 1:2) ) +
        geom_point(shape=5, size = 3) +
        geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.1) +
        facet_grid(factor ~ .)

enter image description here

这样任何人都可以检查数据并亲眼看看它们是正常分布的