グラフを描いた後、一部を塗りつぶしたいときがある。
そんなときにどうしたらいいか?
標準正規分布の場合
確率分布の一部を塗りつぶしたい場合、以下のようにすれば可能。
# 前半
curve(dnorm(x), -4, 4, las=1, xlab="Z")
arrows(0,0,0,dnorm(0),length=0)
# 後半
xvalu <- seq(0,4,length=200)
dvalu <- dnorm(xvalu)
polygon(c(xvalu, rev(xvalu)), c(rep(0,200), rev(dvalu)),col="palegreen")
前半の curve() で確率分布を描く。
ここでは標準正規分布をdnorm()で描く。
arrows()はグラフの高さまで線を引くことができる。
arrows()の中の4つの数字は、始点のX座標とY座標、終点のX座標とY座標を表している。
0,0,0,dnorm(0)であれば、始点は(0,0)で、終点は(0,dnorm(0))までということになる。
最後のlength=は矢印の矢の大きさで0とすれば、矢はなくなり直線になる。
後半の xvalu は、塗りつぶしたい部分のX座標を規定している。
今回は0から4まで200に分けてという指示だ。
これだけ細かくすると人の目には連続しているように見える。
xvaluで規定したX座標に相当するY座標をdvaluに格納する。
polygon()で塗りつぶす。
()内最初のc()は、X座標を0から4に動かして、4から0に戻ってくるという値を指示している。
Y座標は最初の200は0で、あとの200は、xvaluが4から0に小さくなるについて、だんだんに大きくなる。
これで結局中心より右側が塗りつぶされることになる。
色はcol=で指定できる。
palegreenというような色の名前で指定できる。
出来上がりはこちら。
t 分布の場合
下記は自由度df=8の t 分布を描いて、上側、下側2.5パーセントを塗りつぶすスクリプトだ。
n1 <- 5
n2 <- 5
df <- n1+n2-2
curve(dt(x, df), -4, 4, las=1, xlab="t")
arrows(qt(0.975,df),0,qt(0.975,df),dt(qt(0.975,df),df),0)
arrows(qt(0.025,df),0,qt(0.025,df),dt(qt(0.025,df),df),0)
xvalu <- seq(qt(0.975,df),4,length=100)
dvalu <- dt(xvalu, df)
polygon(c(xvalu, rev(xvalu)), c(rep(0,100), rev(dvalu)),col="skyblue")
xvall <- seq(-4, qt(0.025,df),length=100)
dvall <- dt(xvall, df)
polygon(c(xvall, rev(xvall)), c(rep(0,100), rev(dvall)),col="skyblue")
polygon()に使うX座標やY座標の計算の仕方や、polygon()での指示の出し方は上記の標準正規分布のときと同じだ。
ただし今回はdnorm()の代わりに、dt()を使い、dfで指定している自由度を与えてあげないといけない。
またX座標はおよそ2から4までを塗りつぶすことになり、上記例の半分なので、100に分割した。
出来上がりはこちら。
まとめ
curve()を使って確率分布を描き、polygon()を使って分布の一部を塗りつぶす方法を紹介した。
polygon()はいろいろと応用が利くと思う。
参考になれば。
コメント