2014年5月27日火曜日

Rのpolygon関数でグラフを塗りつぶす方法を理解する

グラフの一部を塗りつぶす方法として、segments関数で線分を敷き詰めるやり方を↓こちらで紹介しましたが、

segments関数でグラフを塗りつぶす - Rプログラミングの小ネタ

正直なところ、polygon関数で塗りつぶすやり方↓の方がスマートな気がします。

51. 低水準作図関数 - R-Source

でも、上記に掲載されているサンプルを見ても、すぐに理解できない人も多いのでは?ということで、分かりやすく解説する記事を書いてみようと思います。Rエキスパートの人は帰った、帰った。

例えば、サインカーブの下部を塗りつぶしたいとします。あえて分割数を少なくして、上記に紹介されている方法を適用してみると、↓こんな感じになります。
x座標を3点(polygon関数による描画)

plot(sin, 0, pi) # sinカーブをプロット(0からπまで)
n  <- 3                    # x軸上に取る点の数
xs <- seq(0, pi, length=n) # プロットするx座標を決める
ys <- sin(xs)              # 曲線上のy座標を求める
 
# x軸上→曲線上の順で、頂点を指定する
polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="gray")


3点だけだと、全然曲線っぽくないですよね。

点の数を増やしていきます。(サンプルソースの中のnを変える)

x座標を4点(polygon関数による描画)


x座標を5点(polygon関数による描画)


x座標を10点(polygon関数による描画)
x座標を20点(polygon関数による描画)


↑20点も取れば、ほとんど曲線に見えますね。


x座標を100点(polygon関数による描画)


↑上記は100点。これ以上増やしても見栄えは変わらないと思います。

次は、polygonへの頂点指定の仕組みを見ていきましょう。

c関数で連結してあるので分かりにくいですが、最初にx軸上の点を、次に曲線上の点が指定されています。

polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="gray")

青がx軸上の点の指定、赤がy軸上の点の指定となっています。

rep関数は、0をn個繰り返す(x軸上だからy座標は0なので)、rev関数は、ysベクトルの要素を反対に並べる(帰りがけにプロットしていくので)、という意味です。

点に番号を振って、分かりやすくしてみました。

頂点をナンバリングしたもの(polygon関数による描画)


plot(sin, 0, pi) # sinカーブをプロット(0からπまで)
n  <- 5                    # x軸上に取る点の数
xs <- seq(0, pi, length=n) # プロットするx座標を決める
ys <- sin(xs)              # 曲線上のy座標を求める
 
# x軸上→曲線上の順で、頂点を指定する
polygon( c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="gray") 
 
text(xs, rep(0,n), 1:n)                    #行きがけ(x軸上)
text(rev(xs), rev(ys), (n+1):(2*n), pos=3) #帰りがけ(曲線上)


これらの番号が振られた点を頂点とするポリゴンを描画せよ、という命令なわけですね。




0 件のコメント:

コメントを投稿