3

Stackoverflow ユーザーの皆様へ

エラーバー付きの 3 つの独立変数でグループ化された棒グラフを描画したいと思います。グラフは、geom_bar で ggplot を使用して、積み上げオーバーフロー (グループ化されたバー内の積み上げバー) の例に基づいています。ヘルプ ページの例に従って geom_errorbar を追加すると、次のエラーが発生します。 Error in if (empty(data)) { : missing value where TRUE/FALSE needed

これは私が使用するスクリプトです:

treatment<-rep(c(rep(c(1),8),rep(c(2),8)),2)
origin<-rep(c("A","B"),16)
time<-c(rep(c(5),16),rep(c(10),16))
sulfide<-c(0,10,5,8,9,6,16,18,20,25,50,46,17,58,39,43,20,25,50,46,17,58,39,43,100,120,103,104,150,160,200,180)

Reed<-data.frame(treatment,origin,time,sulfide)

# specify factor types
Reed$treatment<-as.factor(Reed$treatment)
Reed$origin<-as.character(Reed$origin)
Reed$time<-as.factor(Reed$time)

library(ggplot2)
library(scales)

#draw plot
ggplot() +geom_bar(data=Reed, aes(y = sulfide, x = treatment, fill=origin), stat="identity",position="dodge") +theme_bw() + facet_grid( ~ time)+xlab("treatment") +ylab("Sulfide")+ggtitle("Time)")

これは、エラーバーを追加した方法です。

ErrorBars <- function(x, y, upper, lower=upper, length=0.03,...{if(length(x) != length(y) | length(y) !=length(lower) | length(lower) != length(upper))stop("vectors must be same length")arrows(x,y+upper, x, y-lower, angle=90, code=3, length=length, ...)}#function for errorbars

SE<- function(x) sqrt(var(x,na.rm=TRUE)/length(na.omit(x))) #function for SE

Reed$trt<- paste(Reed$treatment,Reed$origin,sep="")#combine treatment and origin to a column 
mean_Reed<-data.frame(tapply(Reed$sulfide,list(Reed$trt,Reed$time),mean,na.rm=TRUE)) #mean
SE_Reed<-data.frame(tapply(Reed$sulfide,list(Reed$trt, Reed$time),SE)) # SE 

limits <- aes(ymax = mean_Reed + SE_Reed, ymin=mean_Reed - SE_Reed)# Define the top and bottom of the errorbars

#plot with error bars:
ggplot() +geom_bar(data=Reed, aes(y = sulfide, x = treatment, fill=origin), stat="identity",position="dodge") +theme_bw() + facet_grid( ~ time)+xlab("treatment") +ylab("Sulfide")+ggtitle("Time)"+ geom_errorbar(limits, width=.2,position="dodge") 

私は本当に自分が間違っていることを見つけることができません。あなたが私を助けてくれることを願っています:)

4

2 に答える 2

2

要約データセットを作成して誤差範囲を作成したい場合は、そのデータセットを正しい形式で取得するだけで済みます。これには多くのオプションがあります。dplyrを使用します。このデータセットのプロットからのすべてのグループ化変数を「きちんとした」形式で保持していることに注意してください。各変数は別の列にあります。

library(dplyr)
meandat = Reed %>% 
    group_by(treatment, time, origin) %>%
    summarise(mean = mean(sulfide, na.rm = TRUE), se = SE(sulfide))

Source: local data frame [8 x 5]
Groups: treatment, time [?]

  treatment   time origin   mean        se
     (fctr) (fctr)  (chr)  (dbl)     (dbl)
1         1      5      A   7.50  3.378856
2         1      5      B  10.50  2.629956
3         1     10      A  31.50  7.858117
4         1     10      B  43.00  6.819091
5         2      5      A  31.50  7.858117
6         2      5      B  43.00  6.819091
7         2     10      A 138.25 23.552689
8         2     10      B 141.00 17.540429

を介してエラーバーを追加できるようになりましgeom_errorbarた。これらのいくつかを再入力する必要がないように、美学をグローバルに設定していることがわかりますggplotが、これは必要に応じて変更できます。position_dodgeエラーバーを各バーの上に正しく配置するために使用します。

ggplot(data = Reed, aes(y = sulfide, x = treatment, fill=origin)) +
    geom_bar(stat="identity", position="dodge") +
    theme_bw() + 
    facet_grid( ~ time)+
    xlab("treatment") +
    ylab("Sulfide")+
    ggtitle("Time")+ 
    geom_errorbar(data = meandat, aes(ymin = mean - se, ymax = mean + se, y = mean), 
                position = position_dodge(width = .9))

ここに画像の説明を入力

stat_summary要約統計を「手動で」計算するのではなく、実際には を介し​​てこれらすべてを行うことができます。例はこちらです。コードはそのようになり、上記と同じプロットが得られます。

ggplot(data = Reed, aes(y = sulfide, x = treatment, fill=origin)) +
    geom_bar(stat="identity",position="dodge") +
    theme_bw() + 
    facet_grid( ~ time) +
    xlab("treatment") +
    ylab("Sulfide") +
    ggtitle("Time") + 
    stat_summary(geom = "errorbar", fun.data = mean_cl_normal, mult = 1, 
               position = position_dodge(width = .9))

私は ggplot2 の開発バージョンであるggplot2_1.0.1.9003stat_summaryを使用してきましたが、を介して関数の引数を追加する必要があることがわかりましたfun.args。これはfun.args = list(mult = 1)、1 標準誤差の誤差範囲を取得するように見えます。

于 2015-09-02T15:42:57.283 に答える