2013-10-17 54 views
7

我有一些數據與標準錯誤關聯,並希望顯示這些錯誤欄。這就是我:ggplot2中的誤差條寬度

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

唯一關注的事情大概是:

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

它提供:all

現在,當我組由因子變量(as.factor(t))的數據,我得到幾條線,而不是一條,這是我想要的,但是,正如你所看到的,誤差線處的水平線更窄,我不知道爲什麼。我試圖改變,甚至拿走widthsize屬性geom_errorbar,但沒有任何反應。無論數據如何,是否有辦法讓每張圖表具有相同寬度的水平線?我的意思是,爲什麼它會有所不同?還是這個寬度傳達了一些信息?

enter image description here

+1

我認爲這將有助於已如果有人可以給我換'geom_errorbar'解釋width'的'的使用和功能'size',因爲它應該是數據和這樣的問題無關。 – wnstnsmth

+0

我試圖用簡單的例子重現問題,但不能。這並不明顯,出了什麼問題。如果您提供數據,則更容易找到問題。 – Roland

+0

我有同樣的問題。你有沒有解決它? – while

回答

3

下面是使用隨機數據可再現的例子。解決問題的方法是將寬度乘以您擁有的類/因素的數量。在下面的圖中,由於我使用了三個因素,使用3的寬度解決了這個問題。 ggplot2似乎通過數據集中數據點的數量來計算相對寬度,而不是x軸上的數值。這是(IMO)的一個錯誤。

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

現在,哪裏與我的例子有所不同?據我所知,你仍然在使用'width = 1'。你的意思是你應該使用'width = 3'? – wnstnsmth

+0

是的。試一下你自己的寬度= 9的例子(或者你有很多關卡)。 – thc

+1

謝謝。我在GitHub上發佈了一個問題https://github.com/hadley/ggplot2/issues/1068 – wnstnsmth