「ggplot では,容易にエラーバーのついた折れ線グラフが描けます!」っていうけど,
ggplot のエラーバーグラフは,エラーバーの横線が長すぎる。
ところで,そのエラーバーは標準偏差なの標準誤差なのそれともそれ以外?それを明示しないと読者を惑わす(書いてあっても,ただしく理解してもらえるかどうか怪しい)。
この図は mean ± sd で描いたもの。
R だって,エラーバー描画は arrows 関数を加えるだけで「簡単に書ける」。
以下の図は,mean ± se で描いたもの。
se = sd / sqrt(サンプルサイズ)
エラーバーの長さは,サンプルサイズが 10 でも当然だが 1/sqrt(10) ≒ 0.3 倍(ほぼ 1/3)になる。
library(ggplot2)
library(ggsci)
x <- data.frame(
date = c(1, 2, 3, 4, 5,
1, 2, 3, 4, 5,
1, 2, 3, 4, 5),
treat = c("A", "A", "A", "A", "A",
"B", "B", "B", "B", "B",
"C", "C", "C", "C", "C"),
mean = c(200, 203, 193, 193, 187,
192, 211, 223, 232, 243,
198, 200, 201, 204, 203),
sd = c(4.2, 3.1, 3.2, 3.6, 3.5,
4.1, 3.5, 3.6, 4.0, 4.3,
4.2, 4.4, 4.3, 4.3, 4.1)
)
ggplot(x, aes(x = date, y = mean, color = treat)) +
geom_line() +
scale_color_nejm() +
geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd, width = 0.3))
###################
mean = matrix(c(200, 203, 193, 193, 187,
192, 211, 223, 232, 243,
198, 200, 201, 204, 203), ncol = 3)
sd = matrix(c(4.2, 3.1, 3.2, 3.6, 3.5,
4.1, 3.5, 3.6, 4.0, 4.3,
4.2, 4.4, 4.3, 4.3, 4.1), ncol = 3)
n = 10 # サンプルサイズ
err = sd / sqrt(n) # 標準誤差(標準偏差で描きたいときは,上で n = 1 とする)
g = ncol(mean) # 群数
d = nrow(mean) # 日数
old = par(mar = c(3, 3, 0.5, 3), mgp = c(1.8, 0.4, 0))
color = rep("gray", g)
lwd = rep(1, g)
color[2] = "red"
lwd[2] = 2
matplot(mean,
type="l",
col = color, # 色
lwd = lwd, # 太さ
lty = 1, # 線種
tck = -0.02, # ティックマークの長さ
las = 1, # 縦軸目盛りを水平に
xlab = "date",
ylab = "mean",
bty = "l") # 枠は描かない
arrows(1:d, mean - err, 1:d, mean + err,
length = 0.025, angle = 90, code = 3, col = rep(color, each = d), xpd = TRUE)
text(d + 0.05, mean[d, ], paste("treat", LETTERS[1:g], sep = "-"),
col = color, pos = 4, xpd = TRUE)
par(old)