グラフィックス参考実例集:曲線のグラフ
の編集
http://www.okadajp.org/RWiki/?%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E5%8F%82%E8%80%83%E5%AE%9F%E4%BE%8B%E9%9B%86%EF%BC%9A%E6%9B%B2%E7%B7%9A%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
COLOR(red){SIZE(20){グラフィックス参考実例集:曲線のグラフ plot, curve, lines, matplot}} ([[グラフィックス参考実例集]]に戻る。[[Rのグラフィックスパラメータ]]を参照する。)~ 曲線のグラフを書く基本は plot 関数と curve 関数です。前者は x,y 座標値を与えた点群を表示し、後者は関数とそのサンプリング x 座標を指定します。曲線の一部を塗りつぶすには関数 polygon を使います。いずれも同じ画面に何度も書き込むため、par(new=TRUE) 等、毎回の参照座標が同一になるように注意する必要があります。 #contents ~ *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) ** 対数軸の利用 [#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) *正規分布のグラフ [#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) **正規分布のグラフ (平均と分散を変えた数種類のグラフを同時表示) [#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 への正規分布の当てはめ [#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) *F 分布のグラフ(polygon 関数による一部塗りつぶし) [#w29ae302] **準備(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 分布のグラフ [#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) * 確率分布のグラフの幾つかの例 (三中信宏さんウェッブページ) [#v85ec5de] [[三中信宏さんウェッブページ:http://cse.niaes.affrc.go.jp/minaka/R/R-top.html]] * 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 関数を用いた曲線の例 [#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(グラフィックス参考実例集:曲線のグラフ/bes11.png, left) * 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) * 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) * プロットを線で結ぶ際、欠損値部分には線を引かない -- 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)
タイムスタンプを変更しない
COLOR(red){SIZE(20){グラフィックス参考実例集:曲線のグラフ plot, curve, lines, matplot}} ([[グラフィックス参考実例集]]に戻る。[[Rのグラフィックスパラメータ]]を参照する。)~ 曲線のグラフを書く基本は plot 関数と curve 関数です。前者は x,y 座標値を与えた点群を表示し、後者は関数とそのサンプリング x 座標を指定します。曲線の一部を塗りつぶすには関数 polygon を使います。いずれも同じ画面に何度も書き込むため、par(new=TRUE) 等、毎回の参照座標が同一になるように注意する必要があります。 #contents ~ *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) ** 対数軸の利用 [#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) *正規分布のグラフ [#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) **正規分布のグラフ (平均と分散を変えた数種類のグラフを同時表示) [#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 への正規分布の当てはめ [#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) *F 分布のグラフ(polygon 関数による一部塗りつぶし) [#w29ae302] **準備(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 分布のグラフ [#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) * 確率分布のグラフの幾つかの例 (三中信宏さんウェッブページ) [#v85ec5de] [[三中信宏さんウェッブページ:http://cse.niaes.affrc.go.jp/minaka/R/R-top.html]] * 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 関数を用いた曲線の例 [#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(グラフィックス参考実例集:曲線のグラフ/bes11.png, left) * 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) * 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) * プロットを線で結ぶ際、欠損値部分には線を引かない -- 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)
テキスト整形のルールを表示する
添付ファイル:
normalgraph2.png
3191件
[
詳細
]
bes11.png
2734件
[
詳細
]
bes1.png
3189件
[
詳細
]
toeic.reading.png
2952件
[
詳細
]
normalgraph1.png
3556件
[
詳細
]
curve2.png
3102件
[
詳細
]
bes2.png
2834件
[
詳細
]
Fgraph.png
3186件
[
詳細
]
curve1.png
3185件
[
詳細
]
plotcolor.png
2926件
[
詳細
]
missingplot.png
2729件
[
詳細
]