COLOR(red){SIZE(20){グラフィックス参考実例集:曲線のグラフ plot, curve, lines, matplot}}

([[グラフィックス参考実例集]]に戻る。[[Rのグラフィックスパラメータ]]を参照する。)~

曲線のグラフを書く基本は plot 関数と curve 関数です。前者は x,y 座標値を与えた点群を表示し、後者は関数とそのサンプリング x 座標を指定します。曲線の一部を塗りつぶすには関数 polygon を使います。いずれも同じ画面に何度も書き込むため、par(new=TRUE) 等、毎回の参照座標が同一になるように注意する必要があります。 

#contents
~

*curve 
*curve [#g18ae937]

引数に与えられた関数か x による expression に対応する曲線を描きます。
curve 関数には曲線方程式、x の範囲と分割数を与えます。

 curve1  <- function () {
  old.par <- par(no.readonly = TRUE)); on.exit(old.par)
   png("curve1.png")
   par(mfrow=c(2,2)) # 画面を 2x2 分割
   curve(x^3-3*x, -2, 2) # 関数を直接与える
   curve(x^2-2, add = TRUE, col = "violet") # 重ねる
   plot(cos, xlim = c(-pi,3*pi), n = 1001, col = "blue") # plot 関数でもOK
   chippy <- function(x) sin(cos(x)*exp(-x/2)) # 複雑な関数を定義
   curve(chippy, -8, 7, n=2001)
   curve(chippy, -8, -5)
   dev.off()
 }
#ref(curve1.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/curve1.png, left)

** 対数軸の利用 
** 対数軸の利用 [#f57d21d3]
 curve2  <- function () {
   old.par <- par(no.readonly = TRUE); on.exit(old.par)
   par(mfrow=c(2,2)) # 画面を 2x2 分割
   for(ll in c("","x","y","xy"))
     curve(log(1+x), 1,100, log=ll, sub=paste("log= '",ll,"'",sep=""))
 }

#ref(curve2.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/curve2.png, left)

*正規分布のグラフ
**準備(線分と矢印)
*正規分布のグラフ [#fb66f603]
**準備(線分と矢印) [#u6935a36]
segmentsはいくつかの線分を一度に描きます。引数には、各線分の始点の座標(x1, y1)と終点の座標(x2, y2)のそれぞれの値をベクトルで 

 segments(x1, y1, x2, y2)

という形で指定します。 

**準備(矢印)
**準備(矢印) [#q7a7802e]
また、関数arrowsはsegmentsと同じ引数をとり、始点の座標(x1, y1)から終点の座標(x2, y2)へ向けて矢印を描きます。 

**準備(マーカの描画)
**準備(マーカの描画) [#t7b39c0a]
 関数pointsは点の座標を指定してマーカを描きます。引数には linesと同じように、各点のx座標,y座標のベクトルを、points(x, y)のように指定するか、x、y成分を持ったリスト、または2列の行列を指定します。マーカの形式は作図パラメータpchによって指定します。 

**準備(文字列の描画)
**準備(文字列の描画) [#xef39bb5]
 関数textで、図表領域上の任意の位置に文字列を描画することができます。座標値、文字列ともにベクトルで指定することができます。 

 text(x, y, labels)

によって、各点( x[i] , y[i] )に文字列 labels[i] を描きます。linesやpointsと同様、x、yを別々に指定する代わりに、x、y成分を持ったリスト、または2列の行列を指定しても構いません。なお、textで文字列を描画する際は、文字列が余白にはみ出しても描かれます。つまり、作図パラメータxpdは常にTRUEとして扱われますので注意して下さい。 さて、余白に文字列を書き込むにはmtextが便利です。 

 mtext(text, side, line, at)

引数textに書き込む文字列を指定し、 sideには余白のサイド番号、lineには図形領域から何行離すかを指定します。 atには文字列を書き込む座標を指定します。この座標は、sideが 1か3(下と上の余白)であればユーザ座標系のx座標を、2か 4 (左と右の余白) であればy座標を指定します。この引数にベクトルを指定すると、指定された位置それぞれに文字列を書きます。この時textにも同じ長さの文字ベクトルが与えられていなければなりません。これは、特殊な目盛を書く場合に利用できます。atを省略した場合、sideで指定された余白の line行だけ図系領域から離れた位置の中央に書き込まれます。この場合、sideが 2か 4(左と右の余白)であれば自動的にsrtの値が90になります。 

**準備(文字列に関する作図パラメータ)
**準備(文字列に関する作図パラメータ) [#uf9d4c07]
文字列描画に関する作図パラメータには以下のものがあります。これらによって、字の大きさ、文字列の描画方向などを設定することができます。 
-cex  文字の大きさを、作図機器ごとに定められている標準文字の大きさを1 として、その何倍にするかで指定します。 複数図表を使う場合、自動的に0.5や1に変更されることがあるので注意して下さい (4.8 節参照)。また、csiを変更すると、この作図パラメータもその値に応じて自動的に変化します。 
-csi  cexと同じく文字の大きさを指定しますが、このパラメータではインチ単位で文字の高さを指定します。 複数図表を使う場合、自動的に標準文字の高さの0.5倍や1倍に変更されることがあるので注意して下さい (4.8 節参照)。また、cexを変更すると、この作図パラメータもその値に応じて自動的に変化します。 
-srt  文字列の回転角を指定します。単位は度です。x軸を基準として反時計回りに回転した角度で指定します。 
-crt  文字の回転角を指定します。単位は度です。x軸を基準として反時計回りに回転した角度で指定します。srtが変更されるとcrtも同時に同じ値となります。したがってsrtとcrtを別の値に設定するときは、crtを明示的に設定する必要があります。例えば、srt=-90、 crt=0と指定すると文字列を縦書きにすることができます。 
-adj  文字列の先頭を0、最後を1とした時に、指定位置が文字列のどの位置になるかを指定します。この値が0ならば指定の位置を文字列の先頭にします。つまり指定の位置の右側に左詰めで描かれます。この値が1ならば文字列の最後が指定の位置になるように描きます。つまり、指定の位置の左側に右詰めになります。 .5 ならば指定の位置が文字列の中央になります。 
-font  フォント番号を指定します。

**正規分布のグラフ 
**正規分布のグラフ [#p2f6d112]

 normgraph1 <- function (k) {
   old.par <- par(no.readonly = TRUE); on.exit(par(old.par))
   par(lab=c(8,8,0))
   png("normalgraph1.png")
   plot(dnorm, -4, 4, xlab="", ylab="density", main="Normal density")
   abline(h=0)
   segments(-3, 0, -3, 0.148);              segments(3, 0,  3, 0.148)
   segments(-2, 0, -2, dnorm(-2));          segments(2, 0,  2, dnorm(2))
   segments(-1, 0, -1, dnorm(-1));          segments(1, 0,  1, dnorm(1))
   arrows(-2, dnorm(-1), -1, dnorm(-1));  arrows(2, dnorm(1), 1, dnorm(1))
   arrows(-1.1, dnorm(-2), -2, dnorm(-2));  arrows(1.1, dnorm(2), 2, dnorm(2))
   arrows(-1.1, 0.148, -3, 0.148);          arrows(1.1,    0.148, 3,    0.148)
   text(0, dnorm(1), labels="68.26%")
   text(0, dnorm(2), labels="95.45%")
   text(0, (dnorm(1)+dnorm(2))/2, labels="99.73%")
   par(ps=15)
   text(-3, 0, expression(mu-3*sigma), pos=1, offset=0.5, xpd=NA )
   dev.off()
 }
#ref(normalgraph1.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/normalgraph1.png, left)

**正規分布のグラフ (平均と分散を変えた数種類のグラフを同時表示)
**正規分布のグラフ (平均と分散を変えた数種類のグラフを同時表示) [#badbb3e8]
 normgraph2 <- function () {
  op <- par(no.readonly = TRUE); on.exit(par(old.par))
  par(usr=c(-5,5,0,2)) # ユーザー座標指定
  mh <- dnorm(0,0,0.7) # 最大 y 座標値
  png("normalgraph2.png")
  normal1 <- function(x) dnorm(x, mean=0, sd=1)    # 正規分布 N(0,1) の密度
  plot(normal1, -5, 5, xlim=c(-5,5), ylim=c(0,mh), xlab="", ylab="", main="")
  normal2 <- function(x) dnorm(x, mean=2, sd=1)    # 正規分布 N(2,1) の密度
  par(new=TRUE)
  plot(normal2, -5, 5, xlim=c(-5,5), ylim=c(0,mh), xlab="", ylab="", main="")
  normal3 <- function(x) dnorm(x, mean=0, sd=2)    # 正規分布 N(0,2) の密度
  par(new=TRUE)
  plot(normal3, -5, 5, xlim=c(-5,5), ylim=c(0,mh), xlab="", ylab="", main="")
  normal4 <- function(x) dnorm(x, mean=0, sd=0.7)  # 正規分布 N(0,0.7) の密度
  par(new=TRUE)
  plot(normal4, -5, 5, xlim=c(-5,5), ylim=c(0,mh), xlab="", ylab="", main="")
  normal5 <- function(x) dnorm(x, mean=-3, sd=0.9)  # 正規分布 N(-3,0.9) の密度
  par(new=TRUE)
  plot(normal5, -5, 5, xlim=c(-5,5), ylim=c(0,mh), xlab="", ylab="", main="")
  dev.off()
 }
#ref(normalgraph2.png)

*第59回 Toeic Reading Score への正規分布の当てはめ
*第59回 Toeic Reading Score への正規分布の当てはめ [#v47bf2d4]
公表平均 262.1, 標準偏差 89.3, 受検者 40,944名。
 toeic.r <- function () {
   old.par <- par(no.readonly = TRUE); on.exit(par(old.par))
   dt <- c(71,190,490,1251,1666,2404,3898,3501,4678,3702,
            3687,4153,2920,2507,1440,1508,1197,500,181)
   cs <- c(5,45,70,95,120,145,170,195,220,245,270,295,
            320,345,370,395,420,445,470,500)
   ccs <- cs[-1]-cs[-length(cs)]
   ft <- function(x) {dnorm(x, mean = 262.1, sd = 89.3)}
   par(usr=c(0,500,0,0.005))
   png("toeic.reading.png")
   ddt <- dt/sum(dt)/ccs
   barplot(ddt, width = ccs, space = 0, col = 'grey' # 棒グラフ
           , xlim = c(0,500), ylim = c(0,0.005), xpd = TRUE
           , axes = TRUE)
    # curve 関数使用。101個のサンプル点間を直線で結ぶ
   curve(ft, from = 0, to = 500, n = 101, add = TRUE, type = "l")
   dev.off()
 }
#ref(toeic.reading.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/toeic.reading.png, left)

*F 分布のグラフ(polygon 関数による一部塗りつぶし)
*F 分布のグラフ(polygon 関数による一部塗りつぶし) [#w29ae302]

**準備(polygon関数)
**準備(polygon関数) [#v9629f7d]
polygonは、多角形を描き、その中を塗りつぶす(または斜線でハッチングする)関数です。以下は最も簡単な呼びだし形式です。 

 polygon(x, y)

引数xとyには多角形の頂点のx、y座標のベクトルを指定します。 xとyの代わりに、x、y成分を持つリストでも、2列の行列でも構いません。polygonは頂点を順に結び、最後に起点と終点とを結んだ多角形を描きます。頂点を指定するベクトルの途中にNAがあると、そこで一旦多角形を区切って、新たに別の多角形を描き始めます。 

引数densityによって、多角形の内部を塗りつぶすか、ハッチングするか、輪郭だけ描くかを制御できます。densityが負の値(デフォルト)なら塗りつぶします[*2]。densityが正の値ならその値を1インチ当たりの線の本数と解釈し、引数angleで指定された角度の線でハッチングします。 density=0と指定すれば、多角形の輪郭のみ描き、内部を塗りつぶしません。 

引数colに色番号を指定することによって、輪郭線と塗りつぶしに用いる色を指定することができます。NAで区切っていくつかの多角形を描く場合、多角形の個数分の長さのベクトルを指定することにより、個々の多角形に対して別々の色を用いることができます。 

border=Fを指定すると、多角形の輪郭を描きません。 

**F 分布のグラフ
**F 分布のグラフ [#v4542624]

 Fgraph <- function () {
   old.par <- par(no.readonly = TRUE); on.exit(par(old.par))
   par(lab=c(8,8,0))
   png("Fgraph1.png")
   DF <- function(x) df(x, df1=9, df2=9) # F 分布の密度関数
   plot(DF, 0, 6, xlab="", ylab="density", main="F distribution density")
   abline(h=0)
   ## 領域をx軸方向に50個の多角形(台形)に等分割
   xvals <- seq(qf(0.025,df1=9,df2=9),qf(0.975,df1=9,df2=9),length=50)
   dvals <- DF(xvals)         # 対応するグラフの高さ
   ## 多角形塗り潰し
   polygon(c(xvals,rev(xvals)),c(rep(0,50),rev(dvals)),col="gray")
   arrows(0.7983, DF(0.7983), 0.7983, 0, length=0.2)
   dev.off()
 }
#ref(Fgraph.png,left)
#ref(グラフィックス参考実例集:曲線のグラフ/Fgraph.png,left)

* 確率分布のグラフの幾つかの例 (三中信宏さんウェッブページ)
* 確率分布のグラフの幾つかの例 (三中信宏さんウェッブページ) [#v85ec5de]
[[三中信宏さんウェッブページ:http://cse.niaes.affrc.go.jp/minaka/R/R-top.html]]

* lines 関数を用いた曲線の例
**折れ線
* lines 関数を用いた曲線の例 [#wc057b8c]
**折れ線 [#s3686e1d]
linesは指定された点を通る折れ線を描きます。引数には、plot と同じように、各点の x座標, y座標のベクトルを、 lines(x, y) のように指定するか、あるいはx、yと言う名の要素を持ったリスト、または2列の行列を指定します。 

**直線
**直線 [#f7b3e39a]
 ablineは切片、傾きを指定して、直線を描く関数です。使い方は、以下の通りです。 
-abline(a, b)  a、bは切片と傾き。直線 y = a + bx を描きます。 
-abline(c(a, b))  上と同じく直線 y = a + bx を描きます。 
-abline(h=y)  yはy座標のベクトル。与えられたy座標の水平線を引きます。 
-abline(v=x)  xはx座標のベクトル。与えられた x 座標の垂直線を引きます。 
-abline(reg)  regはcoef要素を持つリストです。典型的にはlsfitが返す、回帰分析の結果を表すオブジェクトを与えます。 reg$coef が長さ2のベクトルならばそれらを切片と傾きとする直線を描きます。長さが1ならそれを傾きとし、切片0の直線を描きます。 

ablineを使って、図に格子を入れることができます。 

 > plot(1:10)
 > abline(a=0, b=1)              # 切片0 傾き1の直線
 > abline(h=1:10, v=1:10, lty=2) # 格子を描く

**lines 関数を用いた曲線の例
**lines 関数を用いた曲線の例 [#v21102d8]
plot 関数のオプション type='n' で枠だけをまず描き、そこへ追加プロットするテクニックに注意

 bessel1 <- function() {
    nus <- c(0:5,10,20)    # Bessel 関数の次数
    x0 <- 2^(-20:10)        # サンプリング x 座標ベクトル
    ## 注意:両対数軸枠とタイトルだけをまず用意( type='n' は実際には何もプロットしない) 
    plot(x0, x0^-8, log='xy', ylab="",type='n',
       main = "Bessel Functions  J_nu(x)  near 0\n log - log  scale")
    ## 点の間を線で結んで曲線を書く(lines 関数は直前の領域への追加専用であることに注意)
    for(nu in sort(c(nus,nus+.5))) lines(x0,besselJ(x0,nu=nu), col = nu+2)
    legend(3, 1e50, leg=paste("nu=", paste(nus, nus+.5, sep=","), " "), col=nus+2, lwd=1)
  }

枠だけだとこんな風(これ以降のプロットはこの座標に対して行なわれる)
#ref(bes1.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/bes1.png, left)

完成
#ref(bes11.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/bes11.png, left)

* matplot 関数で一度に複数の曲線を描く
* matplot 関数で一度に複数の曲線を描く [#z0498d5e]
expression 関数による数学記号の作図にも注意

 bessel2 <- function() {
    op <- par(no.readonly = TRUE); on.exit(par(old.par))
    xx <- 2:7
    nu <- seq(-10,9, len = 2001)
    par(lab = c(16,5,7))
    ## outer(xx, nu, besselI) は i,j 成分が besselI(xx[i], nu[j]) である行列
    matplot(nu, t(outer(xx, nu, besselI)), type = 'l', ylim = c(-50,200),
          main = expression(paste("Bessel ", I[nu](x), " for fixed ",  x,
              ",  as ", f(nu))),  xlab = expression(nu))
    abline(v=0, col = "light gray",  lty = 3)
    legend(5, 200, leg = paste("x=", xx, " "),  col=seq(xx),  lty=seq(xx))
 }
#ref(bes2.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/bes2.png, left)

* plot 関数の点の色を変数に応じて変える (r-help 記事より 2003.12.15)
* plot 関数の点の色を変数に応じて変える (r-help 記事より 2003.12.15) [#z6b0e001]

 x <- runif(40); y <- runif(40); z <- runif(40)
 plot(x, y, col = ifelse(z>0.5, "red", "blue"))    # z>0.5 なら赤で、その他は青で点プロット

#ref(plotcolor.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/plotcolor.png, left)

* プロットを線で結ぶ際、欠損値部分には線を引かない -- 2005.01.26
* プロットを線で結ぶ際、欠損値部分には線を引かない -- 2005.01.26 [#f4dcf212]
折れ線プロット plot(..., type='l') は欠損値 NA がある点では線を引かない 
 >  x <- seq(0,4*pi,by=0.1)
 >  y <- sin(x)
 >  y[abs(y)>=0.5]=NA  # abs(y)>=0.5 なら値を NA としておく
 >  plot(x,y,type='l') # abs(y) < 0.5 の部分だけをプロット
#ref(missingplot.png, left)
#ref(グラフィックス参考実例集:曲線のグラフ/missingplot.png, left)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS