2014年10月4日土曜日

Rで円を描く方法あれこれ

グラフに円を描くような関数が用意されていてもよさそうなものですが、どうもないみたいですので、自力で描く必要がありそうです。

簡単のため、半径1の円の例です。

まず思いつくのは、

  x^2 + y^2 = 1

をyについて解いて、

  y = ±√(1 - x^2)

という関数の形にして、curve関数を使って描く方法でしょうか↓

curve関数で上側と下側を別々に描く

curve( sqrt(1-x^2), xlim=c(-1,1), ylim=c(-1,1), asp=1)
curve(-sqrt(1-x^2), xlim=c(-1,1), ylim=c(-1,1), add=T)


媒介変数表示を使うやり方もありますね。

 x = cosθ
 y = sinθ

の、x と y の組を plotしていく感じです↓

媒介変数で座標を求めたあとにプロット

theta <- seq(-pi, pi, length=100)
plot(cos(theta), sin(theta), type="l", asp=1)


ちなみに type=l オプションを忘れると↓こんな感じになります。

点でプロットすると理屈が分かりやすい

plot(cos(theta), sin(theta), asp=1)


何度も使う場合は、中心座標や半径を引数として関数化しておくといいですね↓
こんなところに隠れミッキーが!(自分で描いたくせに)

plot.circle <- function(x, y, r){
  theta <- seq(-pi, pi, length=100)
  points(x + r*cos(theta), y + r*sin(theta), type="l", asp=1)
}
plot(c(-3,3), c(-3,3), type="n", asp=1) # 作図領域を用意
plot.circle(0, -1, 2)       # 顔?
plot.circle(-1.9, 1.6, 1.2) # 左耳?
plot.circle( 1.9, 1.6, 1.2) # 右耳?


plot関数でなく、polygon関数を使ってもいいですね↓

polygon関数で線を引いたもの

theta <- seq(-pi, pi, length=100)
plot(c(-1,1), c(-1,1), type="n", asp=1)
polygon( cos(theta), sin(theta))


polygon関数だと塗りつぶす色も指定できますね↓

polygon関数だと塗りつぶし指定もできる

polygon( cos(theta), sin(theta), col="gray")


そして、↓これはどうだ?

textで丸の文字「○」をプロット

plot(c(-1, 1), c(-1, 1), type="n", asp=1)
text(0, 0, "○", cex=65)


text関数で「○」という文字を置いてみました。線が太いし、任意の半径にできないし、これはダメですね・・・

次は絶対におすすめしない、すごくまどろっこしい方法

contour関数の等高線で描かれた円

n <- 100 # メッシュ分割数
x <- seq( -1, 1, length = n )
y <- seq( -1, 1, length = n )
z <- matrix(0, n, n)
for (i in 1:n) {
  for (j in 1:n) {
    z[i, j] <- x[i] ^ 2 + y[j] ^ 2 # ここに陰関数を書く
  }
}
contour(x, y, z, drawlabels = F, levels=1, asp=1)


Rのcontour(等高線)を使って陰関数のグラフを描く - Rプログラミングの小ネタで紹介した方法なんですが、格子状の各点について x^2 + y^2 の値を算出したあとに、値が1のところに等高線を引くという複雑な方法です。


任意の陰関数に適用できるところが便利なんですが、円みたいな簡単な方程式に使うメリットは皆無ですね。

最後の2つは蛇足でした・・・




0 件のコメント:

コメントを投稿