日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

直線とか曲線とか

既出の関数もありますが、改めてまとめてみた。

Rでは、グラフィックデバイスが開いている必要があり、上書きする関数と考えられます。
だから、直線はグラフの王道ですが、Rでは主に装飾で重宝します。
ただ、僕には引数の使い方が直感的でないように思う。

  • lines関数

lines関数は2点のx座標とy座標を指定して、その間を結びます。

> x1 <- c(1,2)
> x2 <- c(8,3)
> x3 <- c(4,4)
> 
> jpeg("lines.plot.jpg")
> lines(x1,x2) # これはエラーになる
 以下にエラー plot.xy(xy.coords(x, y), type = type, ...) : 
   まだ plot.new が呼ばれていません 
> 
> # グラフィックデバイスを開く
> plot(rbind(x1,x2,x3),type="n")
> lines(x=c(x1[1],x2[1]),y=c(x1[2],x2[2]),lty=1,col=1)
> lines(x=c(x1[1],x3[1]),y=c(x1[2],x3[2]),lty=2,col=2,lwd=2)
> dev.off()

で、こんな感じ。

xとyの引数を見て分かるように、x,yは2点間のx座標とy座標を指定する。
個人的には、x1とx2を結ぶなら、lines(x1,x2)みたいにしてほしい。

と考えると、この方が直感的かも。

> plot(rbind(x1,x2,x3),type="n")
> lines(rbind(x1,x2),lty=1,col=1)
> lines(rbind(x1,x3),lty=2,col=2,lwd=2)

結果は上と同じはず。

  • abline関数

abline関数は

    • y = a + bxとする引数aとbを指定して直線を引く
    • 引数hでx = 0に対する平行線を引く
    • 引数vでy = 0に対する平行線を引く
    • 引数coef = c(a,b)を同時に指定して直線を引く
    • 引数regはcoefとほぼ同じ

といった機能を持つ。
lm関数などで回帰したときにグラフにする時に重宝する。

> jpeg("abline.plot.jpg")
> layout(matrix(1:4,ncol=2))
> par(mai=c(.7,.7,.4,.1))
> # y = -1 + 2xを引く
> # グラフィックデバイスを開く
> plot(NA,type="n",xlim=c(-5,5),ylim=c(-5,5),main="y=-1+2x")
> abline(a=-1,b=2,lty=1,lwd=2)
> abline(h=0) # x軸を描く
> abline(v=0) # y軸を描く
> 
> # x軸に対する平行線
> plot(NA,type="n",xlim=c(-5,5),ylim=c(-5,5),main="parallel line of x-axis")
> abline(h=0,v=0)
> abline(h=seq(-5,5,2),lty=2:4,col=2:4)
> 
> # y軸に対する平行線
> plot(NA,type="n",xlim=c(-5,5),ylim=c(-5,5),main="parallel line of y-axis")
> abline(h=0,v=0)
> abline(v=seq(5,-5,-3),lty=c(1,5),lwd=1:2)
> 
> # coefとregを使う
> plot(NA,type="n",xlim=c(-5,5),ylim=c(-5,5),main="coef and reg")
> # coefでy = -1 + 2xを描く
> abline(h=0,v=0,coef=c(-1,2))
> # y=3+2xを描く
> abline(b=2,reg=3,col=2)
> # y=1+2xを描く
> abline(reg=c(1,2),col=3)
> dev.off()

で、こんな感じ。

個人的には、lines関数よりも直感的と思う。