56

Rで次のプロットを生成するにはどうすればよいですか? プロットに示されている点は平均であり、その範囲は最小値と最大値に対応しています。2 つのファイルにデータがあります (以下は例です)。

x   y
1   0.8773
1   0.8722
1   0.8816
1   0.8834
1   0.8759
1   0.8890
1   0.8727
2   0.9047
2   0.9062
2   0.8998
2   0.9044
2   0.8960
..  ...

ここに画像の説明を入力

4

6 に答える 6

141

まず第一に、R が「箱から出してすぐに」エラー バーを描画できないことは、非常に残念で驚くべきことです。

これが私のお気に入りの回避策です。利点は、追加のパッケージが必要ないことです。コツは、矢印 (!) を描くことですが、矢印の代わりに小さな水平バーを使用します (!!!)。このそれほど単純ではないアイデアは、R Wiki のヒントから得たものであり、実際の例としてここに再現されています。

avg「平均値」のベクトルと「標準偏差」の別のベクトルがあると仮定しましょう。sdevそれらは同じ長さnです。横座標をこれらの「測定」の数にしましょうx <- 1:n。これらを使用して、プロット コマンドを次に示します。

plot(x, avg,
    ylim=range(c(avg-sdev, avg+sdev)),
    pch=19, xlab="Measurements", ylab="Mean +/- SD",
    main="Scatter plot with std.dev error bars"
)
# hack: we draw arrows but with very special "arrowheads"
arrows(x, avg-sdev, x, avg+sdev, length=0.05, angle=90, code=3)

結果は次のようになります。

std.dev エラーバーを含む散布図の例

このarrows(...)関数length=0.05では、「矢じり」のサイズ (インチ単位) でangle=90あり、「矢じり」が矢の軸に対して垂直であることを指定し、特に直感的なcode=3パラメーターは、矢じりの両端に矢じりを描画することを指定します。

sdevベクトルのx値に誤差が含まれており、y値が縦座標であると仮定すると、水平誤差範囲の場合、次の変更が必要です。

plot(x, y,
    xlim=range(c(x-sdev, x+sdev)),
    pch=19,...)
# horizontal error bars
arrows(x-sdev, y, x+sdev, y, length=0.05, angle=90, code=3)
于 2014-02-26T09:30:10.780 に答える
11

データ操作にggplotと 少しを使用します。dplyr

set.seed(42)
df <- data.frame(x = rep(1:10,each=5), y = rnorm(50))

library(ggplot2)
library(dplyr)

df.summary <- df %>% group_by(x) %>%
    summarize(ymin = min(y),
              ymax = max(y),
              ymean = mean(y))

ggplot(df.summary, aes(x = x, y = ymean)) +
    geom_point(size = 2) +
    geom_errorbar(aes(ymin = ymin, ymax = ymax))

追加のグループ化列がある場合 (OP のサンプル プロットには x 値ごとに 2 つのエラーバーがあり、データは 2 つのファイルから供給されていると言っています)、最初に 1 つのデータ フレームですべてのデータを取得し、dplyr::group_by呼び出しにグループ化変数を追加する必要があります (たとえば、が列の名前であるgroup_by(x, file)場合file)、それを ggplot の「グループ」美学として追加しaes(x = x, y = ymean, group = file)ます。

于 2015-04-23T16:16:38.727 に答える
6
#some example data
set.seed(42)
df <- data.frame(x = rep(1:10,each=5), y = rnorm(50))

#calculate mean, min and max for each x-value
library(plyr)
df2 <- ddply(df,.(x),function(df) c(mean=mean(df$y),min=min(df$y),max=max(df$y)))

#plot error bars
library(Hmisc)
with(df2,errbar(x,mean,max,min))
grid(nx=NA,ny=NULL)
于 2012-10-23T16:09:15.217 に答える
1

これを行う別の (より簡単な - 少なくとも私にとっては) 方法を以下に示します。

install.packages("ggplot2movies")

data(movies, package="ggplot2movies")
平均の長さと評価をプロットする
rating_by_len = tapply(movies$length,
                       movies$rating,
                       mean)

plot(names(rating_by_len), rating_by_len, ylim=c(0, 200)
     ,xlab = "Rating", ylab = "Length", main="Average Rating by Movie Length", pch=21)
エラーバーをプロットに追加: 平均 - sd、平均 + sd
sds = tapply(movies$length, movies$rating, sd)
upper = rating_by_len + sds
lower = rating_by_len - sds
segments(x0=as.numeric(names(rating_by_len)), 
         y0=lower, 
         y1=upper)

それが役立つことを願っています。

于 2016-10-05T15:21:11.913 に答える
-1

10 回の測定を 3 回繰り返した仮想実験の最初から最後までのコードをまとめました。他のスタックオーバーフラワーの助けを借りて楽しむためだけに。ありがとう...明らかにループはapply使用できるオプションですが、何が起こるか見てみたいです。

#Create fake data
x <-rep(1:10, each =3)
y <- rnorm(30, mean=4,sd=1)

#Loop to get standard deviation from data
sd.y = NULL
for(i in 1:10){
  sd.y[i] <- sd(y[(1+(i-1)*3):(3+(i-1)*3)])
}
sd.y<-rep(sd.y,each = 3)

#Loop to get mean from data
mean.y = NULL
for(i in 1:10){
  mean.y[i] <- mean(y[(1+(i-1)*3):(3+(i-1)*3)])
}
mean.y<-rep(mean.y,each = 3)

#Put together the data to view it so far
data <- cbind(x, y, mean.y, sd.y)

#Make an empty matrix to fill with shrunk data
data.1 = matrix(data = NA, nrow=10, ncol = 4)
colnames(data.1) <- c("X","Y","MEAN","SD")

#Loop to put data into shrunk format
for(i in 1:10){
  data.1[i,] <- data[(1+(i-1)*3),]
}

#Create atomic vectors for arrows
x <- data.1[,1]
mean.exp <- data.1[,3]
sd.exp <- data.1[,4]

#Plot the data
plot(x, mean.exp, ylim = range(c(mean.exp-sd.exp,mean.exp+sd.exp)))
abline(h = 4)
arrows(x, mean.exp-sd.exp, x, mean.exp+sd.exp, length=0.05, angle=90, code=3)
于 2015-04-23T15:38:58.237 に答える