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
.. ...
まず第一に: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)
_
結果は次のようになります。
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)
_
データ操作に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)
。
#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)
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をオーバーライドし、main、xlab、ylabなどの追加パラメーターを渡すこともできます。
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)
お役に立てば幸いです。