26

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

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

我在使闪避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 是主题,也不允许新手使用图)。

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

请注意,这geom_errorbargeom_point闪避一前一后。我如何才能geom_bar同意其他两个?

任何帮助表示赞赏。

4

4 回答 4

23

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

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))

在此处输入图像描述

于 2012-10-24T15:14:55.130 回答
12

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

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

width-argument inside控制要position_dodge相互躲避的事物的躲避宽度。然而,这会产生与条一样宽的晶须,这可能是不希望的。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) 
于 2018-03-26T12:46:19.907 回答
4

第一个更改我根据高级 R 样式指南重新格式化了代码。

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 值。然后我将位置参数更改为“闪避”并添加了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))

在此处输入图像描述

于 2016-01-27T20:05:01.013 回答
3

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

于 2019-04-29T03:28:23.903 回答