[R]グラフの一部を塗りつぶす

積分範囲を表現する場合などにグラフの一部を塗りつぶしたいことがあるかと思います。
RではPolygon(低水準作図関数)を使用することによってグラフの一部を塗りつぶすことが可能です。


とりあえず、関数とかは別にしてPolygon関数を使った作図のサンプルコード。

2・3行目:表示する座標値、最後で最初の場所に戻っています。
6行目:Polygon単体ではグラフがかけないのでplotでグラフ(軸のみ)を作図
9行目:灰色に塗りつぶすようにポリゴンを作図
12行目以降:解説用の文字列(座標)を表示

#プロットする座標
x <- c(1.0, 1.0, 2.0, 3.0, 4.0, 4.0, 1.0)
y <- c(1.0, 2.0, 3.0, 5.0, 4.0, 1.0, 1.0)

#軸を描画(type="n"があるのでx,yが設定されているが中身は表示されない)
plot(x, y, xlim=c(0,5), ylim=c(0,6), type="n", xlab="X軸", ylab="Y軸")

#ポリゴン描画
polygon(x, y, col="gray")

#解説用文字列
t <- c("x[1],y[1]", "x[2],y[2]", "x[3],y[3]", "x[4],y[4]", "x[5],y[5]", "x[6],y[6]", "x[7],y[7]")
y[7] <- y[7]-0.5
text(x, y, t, col="blue")

Polygonを用いた作図

ここで、
(x[2], y[2])~(x[5], y[5])に表示したい関数による座標を表示して
(x[1], y[1])、(x[6], y[6])に始点・終点でグラフの下端を、
(x[7], y[7])に(x[1], y[1])の座標を指定すれば良いことになります。


では、↑を応用して正規分布の確率密度関数の-2σ~+1.5σを塗りつぶしてみます。

確率密度関数の一部を塗りつぶす

#塗りつぶす範囲(-2σ ~ +1.5σ)
min <- -2
max <- 1.5
i <- 200 #分割数(細かくするほどきれいになる)

#まずは正規分布(μ=0、σ=1)の確率密度関数
mu <- 0
sd <- 1
curve(dnorm(x, mu, sd), -4, 4, #-4σ ~ +4σ
 col="black", xlab="x", ylab="Probability density")

#Polygon作図用のデータ作成
#関数部分
xx <- seq(min, max, length=i) #min~maxまでをi等分したデータを作成
yy <- dnorm(xx, mu, sd) #変数にベクトルを入れると関数の結果もベクトルで出力される

#下限・上限を付加
xx<- c(min, xx, max, min)
yy<- c(0, yy, 0, 0)

#Polygonで作図
polygon(xx, yy, col="gray")

#積分範囲を示す線
lines(c(min, min), c(0, dnorm(min, mu, sd)+0.05), col="red")
lines(c(max, max), c(0, dnorm(max, mu, sd)+0.05), col="red")

#積分範囲を示す文字(srt=90:90度回転、adj=0:アライメント左揃え(0.5中央揃え、1:右揃え))
text(min, dnorm(min, mu, sd)+0.05, paste(min,"σ"), srt=90, adj=0)
text(max, dnorm(max, mu, sd)+0.05, paste(max,"σ"), srt=90, adj=0)

さらに、任意関数を定義すればいろいろなグラブの一部を塗りつぶせます。
例えば二次関数(放物線)のグラフの一部を塗りつぶした場合。

放物線(任意関数)の一部を塗りつぶす

#グラフに表示する関数定義
parabola <- function(x) {
 return(0.25 * x^2 + 1)
}

#塗りつぶす範囲(-2 ~ +1.5)
min <- -2
max <- 1.5
i <- 200 #分割数(細かくするほどきれいになる)

#放物線
curve(parabola(x), -4, 4, #-4~+4
 col="black", xlab="x", ylab="y", ylim=c(0,5))

#Polygon作図用のデータ作成
#関数部分
xx <- seq(min, max, length=i) #min~maxまでをi等分したデータを作成
yy <- parabola(xx)

#下限・上限を付加
xx<- c(min, xx, max, min)
yy<- c(0, yy, 0, 0)

#Polygonで作図
polygon(xx, yy, col="gray")

#積分範囲を示す線
lines(c(min, min), c(0, parabola(min)), col="red")
lines(c(max, max), c(0, parabola(max)), col="red")

#積分範囲を示す文字(srt=90:90度回転、adj=0:アライメント左揃え(0.5中央揃え、1:右揃え))
text(min, parabola(min), paste("x=",min), srt=90, adj=0)
text(max, parabola(max), paste("x=",max), srt=90, adj=0)

この記事を作成するに当たって下記のサイトを参考にさせていただきました。