【问题标题】:How to make dodge in geom_bar agree with dodge in geom_errorbar, geom_point如何使geom_bar中的闪避与geom_errorbar中的闪避一致,geom_point
【发布时间】:2012-10-24 13:40:36
【问题描述】:

我有一个数据集,其中在不同日期对不同组进行了测量。

我想要并排的条形图表示不同组在不同日期的测量值,其中条形图组根据测量日期间隔开,误差条覆盖在它们上面。

我无法让geom_bar 中的闪避与geom_errorbar 中的闪避一致。

这是一段简单的代码:

days          = data.frame(day=c(0,1,8,15));
groups        = data.frame(group=c("A","B","C","D", "E"), means=seq(0,1,length=5));


my_data       = merge(days, groups);


my_data$mid   = exp(my_data$means+rnorm(nrow(my_data), sd=0.25));
my_data$sigma = 0.1;


png(file="bar_and_errors_example.png", height=900, width=1200);
plot(ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) +
     geom_bar      (position=position_dodge(width=0.5))                                   +
     geom_errorbar (position=position_dodge(width=0.5), colour="black")                   +
     geom_point    (position=position_dodge(width=0.5), aes(y=mid, colour=group)));
dev.off();

在图中,errorsegments 与它的条形图有一个固定的偏移量(对不起,即使 ggplot2 是主题,也不允许新手使用任何图)。

geom_bar中调整binwidth时,偏移量不固定,每天都在变化。

请注意,geom_errorbargeom_point 会同时闪避。 如何让geom_bar 同意另外两个?

任何帮助表示赞赏。

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    对齐问题的部分原因是您的条形图不代表您想要的数据。以下排列正确:

    ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) +
         geom_bar      (position=position_dodge(), aes(y=mid), stat="identity") +
         geom_errorbar (position=position_dodge(width=0.9), colour="black") +
         geom_point    (position=position_dodge(width=0.9), aes(y=mid, colour=group))
    

    【讨论】:

    • 它没有找到 position.dodge(),这是被 position='dodge' 取代了吗?我有类似的问题并使用了您的解决方案,但除非我将误差线的宽度设置为接近 1,否则误差线不会与 geom_bars 对齐。
    • @HermanToothrot 我刚刚检查过,position_dodgeggplot2 2.2.1 版中的一个函数(这是撰写此评论时的最新版本)。我要指出,函数名中的分隔符是下划线 (_),而不是点 (.)。这可能是您的代码没有找到它的原因。
    • 谢谢布赖恩,我想我想知道 position=position_dodge() 和 position="dodge" 有什么区别?
    • @HermanToothrot 我不认为有任何区别,但我不能肯定地说。
    【解决方案2】:

    这是一个老问题,但由于我今天遇到了问题,我想补充以下内容:

     geom_bar(position = position_dodge(width=0.9), stat = "identity") + 
       geom_errorbar( position = position_dodge(width=0.9), colour="black") 
    

    position_dodge 中的width-参数控制要相互躲避的事物的躲避宽度。然而,这会产生与条一样宽的晶须,这可能是不希望的。 position_dodge 之外的附加宽度参数控制胡须(和条)的宽度:

     geom_bar(position = position_dodge(width=0.9), stat = "identity", width=0.7) + 
       geom_errorbar( position = position_dodge(width=0.9), colour="black", width=0.3) 
    

    【讨论】:

    • 我注意到了这个问题,但是使用宽度会改变胡须的位置,现在它们不再与条对齐
    【解决方案3】:

    第一次更改我根据advanced R style guide重新格式化了代码。

    days <- data.frame(day=c(0,1,8,15))
    
    groups <- data.frame(
        group=c("A","B","C","D", "E"), 
        means=seq(0,1,length=5)
        )
    
    my_data <- merge(days, groups)
    
    my_data$mid <- exp(my_data$means+rnorm(nrow(my_data), sd=0.25))
    my_data$sigma <- 0.1
    

    现在,当我们查看数据时,我们发现那天是一个因素,其他一切都是一样的。

    str(my_data)
    

    为了从图中删除空格,我将日期列转换为因子。在继续之前检查级别是否正确。

    my_data$day <- as.factor(my_data$day) 
    levels(my_data$day)
    

    我所做的下一个更改是在您的 aes 参数中定义 y。我相信你知道,这让 ggplot 知道在哪里寻找 y 值。然后我将位置参数更改为“dodge”并添加了stat="identity" 参数。 "identity" 参数告诉 ggplot 在 x 处绘制 y。 geom_errorbar 继承了 geom_bar 的闪避位置,因此您可以不指定它,但 geom_point 没有,因此您必须指定该值。默认闪避为position_dodge(.9)

    ggplot(data = my_data, 
     aes(x=day,
         y= mid, 
         ymin=mid-sigma, 
         ymax=mid+sigma,       
         fill=group)) +
       geom_bar(position="dodge", stat = "identity") + 
       geom_errorbar( position = position_dodge(), colour="black") +
       geom_point(position=position_dodge(.9), aes(y=mid, colour=group))
    

    【讨论】:

      【解决方案4】:

      有时您将aes(x=tasks,y=val,fill=group) 放入geom_bar 而不是ggplot。这会导致问题,因为 ggplot 向前看 x 并且您通过每个组的位置指定它。

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多