web-dev-qa-db-ja.com

エラーバー付き散布図

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

enter image description here

44
sherlock85

まず第一に:Rがエラーボックスを「箱から出して」描画できないのは非常に残念で驚くことです。

私のお気に入りの回避策は次のとおりです。利点は、追加のパッケージは不要です。トリックは、矢印(!)を描画することですが、矢印の代わりに小さな水平バー(!!!)を使用します。このそれほど単純ではないアイデアは、 R Wiki Tips に由来するものであり、ここでは詳細な例として再現されています。

「平均値」のベクトル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)
_

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

example scatter plot with std.dev error bars

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)
_
113
Laryx Decidua

データ操作に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_呼び出し(たとえば、fileが列の名前である場合はgroup_by(x, file))、それをggplotに「グループ」の美学として追加します。たとえば、aes(x = x, y = ymean, group = file)

8
Gregor
#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)
6
Roland

Laryx Deciduaの答えを要約すると:

次のような関数を定義して使用する

plot.with.errorbars <- function(x, y, err, ylim=NULL, ...) {
  if (is.null(ylim))
    ylim <- c(min(y-err), max(y+err))
  plot(x, y, ylim=ylim, pch=19, ...)
  arrows(x, y-err, x, y+err, length=0.05, angle=90, code=3)
}

ここで、自動ylimをオーバーライドし、mainxlabylabなどの追加パラメーターを渡すこともできます。

3
Ehud Schreiber

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

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

お役に立てば幸いです。

1
aggers