使用ggplot2的线图中误差线的宽度 [英] Width of error bars in line plot using ggplot2

查看:136
本文介绍了使用ggplot2的线图中误差线的宽度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些带有标准错误的数据,并希望通过错误条显示这些数据。那就是我所拥有的:

I have some data with standard errors associated and would like to display these with error bars. That's what I have:

# generate some data
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24*3) + runif(24*3, 0, 5),ci = runif(24*3, 0, 2), t = c(rep("a",24),rep("b",24),rep("c",24)))

pd <- position_dodge(0.3)
  dayplot <- ggplot(hod, aes(x=h, y=mean, colour=as.factor(t),group=as.factor(t))) + 
    geom_line(position=pd, size=1) +
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci),
                  width=1,
                  size=0.5,
                  position=pd) +
    geom_point(position=pd, shape=21, size=1, fill="white") +
    scale_x_continuous(limits=c(-0.5,23.5),
                       breaks=c(0:8*3),
                       labels=ifelse(
                              c(0:8*3) < 10,
                              paste('0',c(0:8*3),':00',sep=''),
                              paste(c(0:8*3),':00',sep='')
                              )
                       ) +
    xlab("Hour of day") + ylab(ylabel) + labs(title = varlabels[var]) +
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
          axis.title.x = element_text(vjust=-1),
          axis.title.y = element_text(angle=90, vjust=0),
          legend.margin = unit(c(0), "cm"),
          legend.key.height = unit(c(0.9), "cm"),
          panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)),
          panel.grid.minor = element_blank(),
          plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0)
    )

唯一感兴趣的是可能是:

The only thing of interest is probably:

geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci),
                      width=1,
                      size=0.5,
                      position=pd)

它给出:< img src = https://i.stack.imgur.com/4M6sY.png alt = all>

It gives:

现在,当我按因子变量( as.factor(t))对数据进行分组时,我得到了几行而不是一行,但是我想要的是,如您所见,误差条上的水平线更窄,我不知道为什么。我尝试更改甚至删除了 geom_errorbar width size 属性$ c>,但是什么也没有发生。是否有一种方法可以使每个图表的水平线宽度相同,而无论数据如何?我的意思是,为什么要有所不同?还是该宽度传达了一些信息?

Now when I group the data by a factor variable (as.factor(t)), I get several lines instead of one, which is what I want, BUT, as you can see, the horizontal lines at the error bars are more narrow, and I can't figure out why. I tried changing and even taking away the width and size attribute of geom_errorbar, but nothing happens. Is there a way to have the same width of the horizontal lines for every chart, no matter the data? I mean, why should it vary? Or does that width convey some information?

推荐答案

以下是使用随机数据的可复制示例。解决此问题的方法是将宽度乘以您拥有的类/因子的数量。在下面的图中,由于我使用了三个因素,因此使用3的宽度可以解决此问题。 ggplot2似乎是根据数据集中数据点的数量而不是x轴上的数值来计算相对宽度。这是(IMO)错误。

Below is a reproducible example using random data. The fix to the problem is to multiply the width by the number of classes/factors that you have. In the plot below, since I used three factors, using a width of 3 fixes the problem. ggplot2 seems to calculate the relative width by the number of data points in your dataset, rather than the numeric values on the x-axis. This is (IMO) a bug.

library(ggplot2)
library(grid)

#plot with factors
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24*3) + runif(24*3, 0, 5),ci = runif(24*3, 0, 2), t = c(rep("a",24),rep("b",24),rep("c",24)))
pd <- position_dodge(0.3)
  dayplot <- ggplot(hod, aes(x=h, y=mean, colour=as.factor(t),group=as.factor(t))) + 

    geom_line(position=pd, size=1) +
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci),
                  width=1,
                  size=0.5,
                  position=pd) +
    geom_point(position=pd, shape=21, size=1, fill="white") +
    scale_x_continuous(limits=c(-0.5,23.5),
                       breaks=c(0:8*3),
                       labels=ifelse(
                              c(0:8*3) < 10,
                              paste('0',c(0:8*3),':00',sep=''),
                              paste(c(0:8*3),':00',sep='')
                              )
                       ) +
    xlab("Hour of day") +
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
          axis.title.x = element_text(vjust=-1),
          axis.title.y = element_text(angle=90, vjust=0),
          legend.margin = unit(c(0), "cm"),
          legend.key.height = unit(c(0.9), "cm"),
          panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)),
          panel.grid.minor = element_blank(),
          plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0)
    )
print(dayplot)


#plot without factors
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24) + runif(24, 0, 5),ci = runif(24, 0, 2))
pd <- position_dodge(0.3)
  dayplot <- ggplot(hod, aes(x=h, y=mean)) + 

    geom_line(position=pd, size=1) +
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci),
                  width=1,
                  size=0.5,
                  position=pd) +
    geom_point(position=pd, shape=21, size=1, fill="white") +
    scale_x_continuous(limits=c(-0.5,23.5),
                       breaks=c(0:8*3),
                       labels=ifelse(
                              c(0:8*3) < 10,
                              paste('0',c(0:8*3),':00',sep=''),
                              paste(c(0:8*3),':00',sep='')
                              )
                       ) +
    xlab("Hour of day") +
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
          axis.title.x = element_text(vjust=-1),
          axis.title.y = element_text(angle=90, vjust=0),
          legend.margin = unit(c(0), "cm"),
          legend.key.height = unit(c(0.9), "cm"),
          panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)),
          panel.grid.minor = element_blank(),
          plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0)
    )

print(dayplot)

这篇关于使用ggplot2的线图中误差线的宽度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆