グラフィックス参考実例集:曲線のグラフ plot, curve, lines, matplot

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

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


curve

引数に与えられた関数か 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()
}
 left

対数軸の利用

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=""))
}
 left

正規分布のグラフ

準備(線分と矢印)

segmentsはいくつかの線分を一度に描きます。引数には、各線分の始点の座標(x1, y1)と終点の座標(x2, y2)のそれぞれの値をベクトルで

segments(x1, y1, x2, y2)

という形で指定します。

準備(矢印)

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

準備(マーカの描画)

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

準備(文字列の描画)

 関数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になります。

準備(文字列に関する作図パラメータ)

文字列描画に関する作図パラメータには以下のものがあります。これらによって、字の大きさ、文字列の描画方向などを設定することができます。

  • 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  フォント番号を指定します。

正規分布のグラフ

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()
}
 left

正規分布のグラフ (平均と分散を変えた数種類のグラフを同時表示)

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()
}
normalgraph2.png

第59回 Toeic Reading Score への正規分布の当てはめ

公表平均 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()
}
 left

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

準備(polygon関数)

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 分布のグラフ

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()
}
Fgraph.png

確率分布のグラフの幾つかの例 (三中信宏さんウェッブページ)

三中信宏さんウェッブページ

lines 関数を用いた曲線の例

折れ線

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

直線

 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 関数を用いた曲線の例

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)
 }

枠だけだとこんな風(これ以降のプロットはこの座標に対して行なわれる)

 left

完成

 left

matplot 関数で一度に複数の曲線を描く

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))
}
 left

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

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

プロットを線で結ぶ際、欠損値部分には線を引かない -- 2005.01.26

折れ線プロット 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 の部分だけをプロット
 left

添付ファイル: filetoeic.reading.png 1990件 [詳細] filenormalgraph1.png 2570件 [詳細] filebes1.png 2210件 [詳細] filemissingplot.png 1728件 [詳細] fileFgraph.png 2151件 [詳細] filebes11.png 1759件 [詳細] filecurve1.png 2144件 [詳細] fileplotcolor.png 1891件 [詳細] filenormalgraph2.png 2175件 [詳細] filebes2.png 1780件 [詳細] filecurve2.png 2031件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1727d)