データの視覚化 : plot()
例えばデータが入っているベクトル x ,y を点の座標として以下の様に入力する.すると散布図の出力が得られる.プロット範囲は引数 xlim, ylim で決めることが出来る.
x <- 1:10 y <- 1:10 # plot(x 軸のデータ, y 軸のデータ, オプション) plot(x, y) # 範囲は自動で決まる(xlim=c(1,10)を指定した場合と同じ) plot(x, y, xlim=c(10,1)) # x 軸の正の向きを左向きにすることも出来る |
また,数学関数を与えてそのグラフを出力することも出来る.
plot(sin, -pi, 2*pi) # plot(関数名, 下限, 上限) gauss.density <- function(x) 1/sqrt(2*pi)*exp(-x^2/2) # 標準正規分布の密度 plot(gauss.density,-3,3) |
時系列のデータをプロットする際には,次のようにする.
ts.plot(USgas) |
関数 |
機能 |
cpgram() |
累積ピリオドグラムをプロットする. |
lag.plot() |
時系列のラグプロットを行う. |
monthplot() |
時系列の季節成分をプロットする. |
ts.plot() |
複数の時系列を一つの画面にプロットする. |
3 次元プロット
3 次元的にプロットする場合は関数 persp() を用いる.
persp(x 軸のデータ, y 軸のデータ, z 軸のデータ, col = 色, theta = 横回転の角度, phi = 縦回転の角度, expand = 拡大率, border=NA) |
例として 2 次元正規分布を描く.
x <- seq(-3,3,length=50) # x 方向の分点 y <- x # y 方向の分点 rho <- 0.9 # 2次元正規分布の定数 gauss3d <- function(x,y) { # 2次元正規分布の関数 1/(2*pi*sqrt(1-rho^2))*exp(-(x^2-2*rho*x*y+y^2) / (2*(1-rho^2))) } z <- outer(x,y,gauss3d) # 外積をとって z 方向の大きさを求める z[is.na(z)] <- 1 # 欠損値を1で補う persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue") |
plot() の形式指定
関数 plot() の引数 type によって様々な形式でプロットすることが出来る.type には次の 9 種類の文字のいずれかを指定することが出来る.
引数 |
機能 |
type="p" |
点プロット(デフォルト) |
type="l" |
線プロット(折れ線グラフ) |
type="b" |
点と線のプロット |
type="c" |
"b" において点を描かないプロット |
type="o" |
点プロットと線プロットの重ね書き |
type="h" |
各点から x 軸までの垂線プロット |
type="s" |
左側の値にもとづいて階段状に結ぶ |
type="S" |
右側の値にもとづいて階段状に結ぶ |
type="n" |
軸だけ描いてプロットしない(続けて低水準関数でプロットする場合) |
以下に例を示す.
x <- rnorm(10) plot(x, type="l") |
対数軸や軸の範囲の指定
軸に関する設定を行なう為に以下の引数を追加することが出来る.
引数 |
機能 |
log="x" |
"x" ( x 対数軸) ,"y" ( y 対数軸) ,"xy" (両対数軸) の何れかを指定することが出来る (対数は常用対数のみ) . |
xlim=c(0, 1),ylim=c($-1$, 1) |
長さ 2 のベクトルで x 座標, y 座標の最小値と最大値を与える,他にも xlog, ylog で対数プロットが出来る.ベクトルを降順に並べる (例:c(2, -2)) と,プロットの向きが逆になる. |
axes=FALSE |
軸の生成を抑制する.軸の他に表題,刻み,目盛も描くかどうかを論理値で指定する(省略時は TRUE).他に xaxs, yaxs が指定出来る. |
以下に例を示す.
x <- rnorm(10) plot(x, ylim=c(-30, 30), type = "l") |
タイトルなどの指定
表題などに関する設定を行なう為に以下の引数を追加することが出来る.
引数 |
機能 |
main="Title" |
タイトルを与える文字列を指定する.この引数を省略するとは表題は描かれない. |
sub="SubTitle" |
サブタイトルを与える文字列を指定する.この引数を省略すると副題は描かれない. |
xlab="X-Label",ylab="Y-Label" |
それぞれ x 座標名, y 座標名を与える文字列を指定する.省略すると,x 軸のデータとして与えられた引数の名前が座標名として描かれる. |
ann = F |
軸のラベルを描かないようにすることも出来る ( xlab = "" ,ylab = "" を同時に指定した場合と同じ.) . |
tmag=1.2 |
プロットの別の注釈するテキストに関する主なタイトルのテキストの拡大率を指定する. |
以下に例を示す.
x <- rnorm(10) plot(x, main="Simple Time Series") |
図の重ね合わせ
単純な作図ならば,引数に add=T を入れることで重ねた図を描くことができる.2 つのグラフの x 軸と y 軸の座標は自動的に合わせられる.
plot(cos, -pi, pi, lty=2) curve(sin, add=T) |
中には add=T を引数にもってくることが出来ないものがある.そこで,グラフィックスパラメータの new を T と指定することで,既存のグラフに新たなグラフを上書きするように指定することが出来る. 図を重ね合わせるには,関数 par() を用いる. とりあえずは図が重ね合わされるが,軸もラベルもバラバラである.
plot(sin, lty=2) # sin(x) を描く par(new=T) # 上書き指定 plot(cos) # cos(x) を上書き |
軸を合わせるには,2 つの作図関数(ここでは関数 plot() )の引数 xlim と ylim を合わせればよい.・・・が,まだ y 軸ラベルがおかしなことになっている.
plot(sin, xlim=c(0,5), ylim=c(-1,1), lty=2) # sin(x) を描く par(new=T) # 上書き指定 plot(cos, xlim=c(0,5), ylim=c(-1,1)) # cos(x) を上書き |
ラベルを合わせるには,1 つ目の作図関数(ここでは関数 plot() )の引数 xlab と ylab に空白 "" を指定し,2 つ目の作図関数でラベルを指定すればよい.
plot(sin, xlim=c(0,5), ylim=c(-1,1), ylab="", lty=2) # sin(x) を描く par(new=T) # 上書き指定 plot(cos, xlim=c(0,5), ylim=c(-1,1)) # cos(x) を上書き |
また,1 つ目の作図関数(ここでは関数 plot() )の引数 ann(軸とラベルの出力をする/しない)に FALSE を指定してもよい.
plot(sin, xlim=c(0,5), ylim=c(-1,1), ann=F, lty=2) # sin(x) を描く par(new=T) # 上書き指定 plot(cos, xlim=c(0,5), ylim=c(-1,1)) # cos(x) を上書き |
図の重ね合わせ
x <- rnorm(100) # 正規乱数を 100 個生成して hist(x, xlim=c(-4,4), ylim=c(0,0.5), prob=T, ann=F) # ヒストグラムを描く par(new=T) # 上書き可にしてから plot(density(x), xlim=c(-4,4), ylim=c(0,0.5), xlab="" , ylab="" , main="" , col="red" ) # 密度推定の曲線を上書きする |
点の色を条件に応じて変える
点の色を条件に応じて変える場合,上記の方法で図を重ね合わせて・・・としてもよいが,以下のように条件分岐すると簡単に実現できる.
x <- runif(100) y <- runif(100) plot(x, y, col = ifelse(y>0.5, "red", "blue")) # y > 0.5 なら赤, その他は青 |
plot() への引数の与え方による出力の違い
plot(x)
- ベクトル x の要素が実数ならば,x は時系列データとみなされ,横軸を自然数,縦軸をデータ x 要素とする時系列プロットが描かれる.
- ベクトル x が時系列データならば,そのまま時系列プロットが描かれる.
- ベクトル x の要素が複素数ならば,横軸を実数,縦軸を虚部とするプロットが描かれる.
- x が2列の行列ならば,横軸を一列目,縦軸を2列目とするプロットが描かれる.
- x が2次元リストならば,その要素を横軸,縦軸としてプロットが描かれる.ただし
names() を使ってどちらが x なのか y なのかラベルをつける必要がある.
plot(rnorm(10)) x <- list(1:5, 3:7); names(x) <- c("X", "Y") plot(x) |
plot(x, y)
データが入っているベクトル x ,y やリスト x ,y を点の座標として与えると散布図を描く.
x <- rnorm(10) y <- rnorm(10) plot(x,y) |
plot(y ~ x)
以下の様に回帰式として入力することも出来る.
x <- rnorm(10) y <- rnorm(10) plot(y ~ x) |
plot(f)
f は因子オブジェクトである. f の棒グラフを描く.
f <- factor(c(rep("A",3), rep("B",5))) plot(f) |
plot(f, y)
f は因子オブジェクト,y は数値ベクトルである.f の各水準に対する y の箱ひげ図を描くときに使う.
x <- factor(c(rep("A",3), rep("B",5))) y <- rnorm(8) plot(f, y) |
plot(df)
df はデータフレームである.データフレーム中の変量のプロットを行う.
plot( ~ expr)
expr は "+" で仕切られたオブジェクト名のリスト (例えば a+b+c ) である.名前が与えられたオブジェクトの分布関数のプロットを行う.
plot(~ group, data=sleep) plot(~ extra, data=sleep) |
plot(y ~ expr)
y は任意のオブジェクト,expr は "+" で仕切られたオブジェクト名のリスト(例えば a+b+c )である.expr に名前が与えられた全てのオブジェクトに対して y のプロットを行う.
ヒストグラム:hist()
関数 hist() でヒストグラムを描くことが出来る. (異なる区切り幅のヒストグラムを描くことも出来る)
x <- rnorm(50) # 一次元データ hist(x, breaks = seq(-3,3,1) ) # -3 から -3 まで 1 ずつの幅で描く hist(x, breaks = c(-3,-1,0,0.5,3) ) # 異なる区切り幅 |
例)株価の価格変動分布
> library(gregmisc) > nikkei<-read.xls("data01.xls",sheet=1) > str(nikkei) #データの構造を調べる 'data.frame': 629 obs. of 4 variables: $ X : int 1 2 3 4 5 6 7 8 9 10 ... $ open : int 9840 9845 9845 9850 9845 9845 9835 9830 9830 9830 ... $ high : int 9850 9850 9850 9850 9850 9845 9840 9835 9835 9835 ... $ close: num 9840 9840 9840 9845 9840 ... > nikkei$close[50] [1] 9810 > nikkeiclose<-rev(nikkei$close) # 終値を日付の昇順に(rev) > nikkeiLogdif<-diff(log(nikkeiclose)) #nikkeicloseの対数をとってその階差をnikkeiLogdifへ代入 > hist(nikkeiLogdif,30,xlim=c(-0.003,0.003)) #ヒストグラムを表示 > hist(nikkeiLogdif,10,xlim=c(-0.003,0.003),prob=TRUE) #規格化して縦軸を確率密度する > lines(density(nikkeiLogdif)) #曲線による近似 |
作図関数一覧
まず,低水準作図関数の一覧表を挙げる.
種類 |
関数 |
機能 |
点 |
points(x, y) , points(c(x, y)) |
各点の x 座標と y 座標を指定することで点列を描く (規定では points() に対して,関数の引数 type に "p" を与える) . マーカーの形式はグラフィックスパラメータ pch によって指定する.また,points(approx(x, y)) でデータの線形補間が行える. |
直線 |
lines(x, y) , lines(c(x, y)) |
各点の x 座標と y 座標を指定することで,それぞれの点を通る直線・曲線を描く.点列を描く (規定では lines() に対して,関数の引数 type に "l" を与える) . |
abline(a, b), abline(c(a, b)) |
a ,b は切片と傾きを表し,直線 y = a + bx を描く. |
|
abline(h = y) |
ベクトルで与えられた y 座標の水平線を引く. |
|
abline(v = x) |
ベクトルで与えられた x 座標の垂直線を引く. |
|
abline(result) |
result は関数 lm() で直線回帰を行った結果が入ったオブジェクトで,回帰直線が描かれる. |
|
格子 |
grid(a, b) |
a × b 本の格子を描く.引数として col, lty, lwd が指定できる |
線分 |
segments(x0, y0, x1, y1) |
始点の座標 (x0,y0) と,終点の座標 (x1 ,y1) を通る線分を描く. |
矢印 |
arrows(x0, y0, x1, y1) |
始点の座標 (x0,y0) と,終点の座標 (x1 ,y1) を通る矢印を描く. |
矩形 |
rect(x0, y0, x1, y1) |
始点の座標 (x0,y0) と,終点の座標 (x1 ,y1) を通る長方形を描く.引数として col, border, density が指定できる |
文字 |
text(x, y, labels) |
座標 (x,y) にラベルが描かれる.座標値と文字列をベクトルで指定することも出来る.text の引数に srt = -(回転角) を入れることで,プロットの x 軸ラベルを45度回転させることが出来る. |
mtext(text, side = 3, line = 0, at = NA) |
書き込む文字列を引数 text で指定し,side に文字列を書き込む余白位置を表す番号 (1:下,2:左,3:上,4:右) を指定する.ここで line には図形領域から何行離すかを指定し,at には文字列を書き込む座標を指定することも出来る. |
|
枠 |
box() |
軸や目盛を描かず枠だけ描く.例えば box(lty='1373', col = 'red') として色や線の太さを指定することも出来る.(この場合は図の枠に赤い模様が付く). |
題名 |
title(main, sub) |
引数 main に上部余白に描かれるメインタイトルを,引数 sub に下部余白に描かれるサブタイトルを指定して,図の上下の余白部分にタイトルを追加する.省略すると,それぞれメインタイトルとサブタイトルが描かれなくなる.また,引数 tmag でテキストの拡大率を指定することが出来る. |
軸 |
axis(side=4, labels=F) |
座標を描く (1:下,2:左,3:上,4:右).引数 labels に FALSE を指定すると目盛のラベルは描かれなくなる.また,引数 at=1:10 で目盛のラベルを指定することが出来る. |
axis(side=1, pos=0) |
引数 pos で軸を描く位置を指定することが出来る.上 (side=3) か下 (side=1) に軸を描く場合は y 座標を,右 (side=4) か 左 (side=2) に軸を描く場合は x 座標を pos に与えればよい.例えば pos = 0 とすれば原点を通る座標軸を描くことが出来る. |
|
凡例 |
legend(x, y, legend) |
座標 (x,y) に凡例を追加する.引数 legend に文字ベクトルを指定することにより複数行に渡る凡例を,引数 ncol に 2 以上の数値を指定することで複数列に渡る凡例を作ることが出来る. |
legend(locator(1), legend=文字) |
関数 locator() により対話的に凡例の位置を決定する. |
|
legend(..., fill=v , col=v) |
箱を塗りつぶす色,点や線を描く色を指定する. |
|
legend(..., lty=v , lwd=v , pch=v) |
線の種類と線の幅,プロット用の文字 (文字ベクトル) を指定する. |
|
図形 |
polygon(x,y) |
(x,y) に多角形の頂点の座標ベクトル(または x ,y 成分を持つリストや行列)を指定して多角形を描いて中を塗りつぶす.要素に NA があると,多角形の生成は終了する. |
polygon(x, y, density=c(10, 20), angle=c(-45, 45)) |
引数 density により,ビット/インチで太さを指定したラインを使って多角形の内部に影を入れることが出来る.このとき,引数 angle で角度 (左回りに) を与えて線の傾斜を指定することが出来る.引数は border や col , lty や xpd を指定することが出来る. |
例:図の消去
frame() plot.new() |
plot(-4:4, -4:4, type = "n") points(rnorm(200), rnorm(200), pch="+", col = "red") |
例:折れ線の描画
x <- seq(0, 10, by=0.1) y <- seq(0, 1, by=0.01) plot(x, y, ylab="", type='n', main = "Title\n- subtitle -") for(i in 1:5) lines(x, beta(x,i), col = i) |
例:直線の描画
plot(1:10) abline(a=0, b=1) # 切片 0 ,傾き 1 の直線 abline(h=1:10, v=1:10, lty=2) # 格子を描く |
例:線分と矢印
plot(1:10) segments(2,2,3,3) # 点(2,2) と点 (3,3) を通る線分を描く arrows(5,5,7,7) # 点(5,5) と点 (7,7) を通る矢印を描く |
例:文字列の描画
plot(1:10) # text() と locator() の組み合わせ text(locator(1), labels = "値") # 座標を一つだけ得て,その位置に文字列を描き込む plot(1:10, (-4:5)^2, main="Parabola Points", xlab="xlab", ylab="") mtext("subtitle") # 関数 mtext() を普通に使う場合 for(s in 1:4) # 引数 side などを変化させた場合 mtext(paste("mtext(..., line= -1, {side, col, font} = ",s, ", cex = ", (1+s)/2, ")"), line = -1, side=s, col=s, cex= (9+s)/10) |
例:枠を描く
box() |
例:タイトル,サブタイトルの追加
plot(rnorm(50), rnorm(50)) title(main="Main Title", sub = "Sub Title") |
plot(rnorm(50), rnorm(50), xlim=c(-3,3), ylim=c(-3,3), axes = F, ann=F) axis(1, pos = 0, at = -3:3, adj = 0, col = 2) # 赤で X 軸を描く axis(2, pos = 0, at = -3:3, adj = 1, las = 2) # 黒で Y 軸を描く box() |
例:凡例の描画
plot(1:10, 1:10, ann=F, type='n') legend(4, 4, paste("example",c(1:5)), col = c(1:5), lwd=1, merge = TRUE, bg='gray90') # (4,4) に凡例を描画 legend(5, 9, paste("sin(",6:9,"pi * x)"), col=6:9, pch=3, ncol=2, cex=1.1, pt.bg="pink") # (5,9) に凡例を描画 |
例:多角形の描画
plot(c(1,9), 1:2, type="n") polygon(1:9, c(2,1,2,1,NA,2,1,2,1), density=c(10, 20), angle=c(-45, 45)) |
作図例
まず,散布図を描いた後,まず関数 axis() で 両軸を描き,次に関数 box() で枠を描く.さらに関数 legend() で凡例を描いた後,最後に関数 polygon() で多角形を描いている.
plot(rnorm(50), rnorm(50), xlim=c(-3,6), ylim=c(-3,3), axes = F, ann=F) axis(1, pos = 0, at = -3:6, adj = 0, col = 2) # 赤で X 軸を描く axis(2, pos = 0, at = -3:6, adj = 1, las = 2) # 黒で Y 軸を描く box() legend(2, 3, paste("sin(",6:9,"x)"), col=6:9, pch=3, ncol=2, cex=1.1, pt.bg="pink") # (5,9) に凡例を描画 polygon(3:6, c(-2,-1,-2,-1), density=c(10, 20), angle=c(-45, 45)) arrows(5, -1, 4, 2, col="blue") # (5,-1) から (4,2) に矢印を描く |
関数 polygon() を用いることで,グラフの一部に影を付けることが出来る.まず,標準正規分布の密度関数のグラフを -4 ≦ x ≦ 4 の範囲でプロットする.そのうち 2 ≦ x ≦ 4 の範囲に灰色の影を付けるには,以下の様に多数の多角形に分割して関数 polygon() で塗りつぶしをすればよい.具体的には xvals ,rep(0,10) の組合せで x 軸上の辺を結び,rev(xvals) ,rev(dvals) の組合せでグラフに沿った辺を結べばよい.
plot(dnorm, -4, 4) xvals <- seq(2, 4, length=10) # 領域をx軸方向に10個の多角形(台形)に等分割 dvals <- dnorm(xvals) # 対応するグラフの高さ polygon(c(xvals,rev(xvals)), c(rep(0,10),rev(dvals)),col="gray") # 塗りつぶす title("Title") # タイトルを描く mtext("sub-title", side=4) # 文字を描く |
Back to R