(Press ?
for help, n
and p
for next and previous slide)
村田 昇
2020.05.08
package::graphics
に含まれる代表的な描画関数を取り上げて解説する
help()
(ヘルプ)と
と関数 example()
(例題)
を参照のことコンソール / R Scriptで実行する場合:
help(pdf)
: PDFファイルに保存help(png)
: PNGファイルに保存help(dev.copy)
: “graphic device” 間でコピーなどを参照
plot()
ベクトルデータの描画を行う
基本書式
plot(x, y=NULL, type="p", xlim=NULL, ylim=NULL,
main=NULL, xlab=NULL, ylab=NULL, ...) # ...はその他のオプション
x
, y
: ベクトル. y
は省略可能.type
: 描画タイプ.既定値は p
(点).
l
(折れ線)など指定可xlim/ylim
: \(x/y\) 軸の範囲.既定値は自動的に決定main
: 図のタイトル.既定値は空白xlab
: \(x\) 軸のラベル名.既定値は Index
ylab
: \(y\) 軸のラベル名.既定値は x
のオブジェクト名plot()
のオプション...
の部分)
col
: 色の指定.
"red"
や "blue"
など. colors()
で照会できる)pch
: 点の形.
詳細は help(points)
を参照lty
: 線のタイプ.
実線・破線など.タイプ名もしくは数字で指定.
詳細は help(par)
を参照lwd
: 線の太さ.数字で指定cex
: 文字の大きさ.
既定値の何倍にするかを指定## plot(x) の場合
x <- pi/6*(0:12) # 30度(pi/6)おきに1周期分 (0-2*pi)
plot(sin(x)) # x軸はベクトルの要素番号(Index),y軸はsin(x)の値を描画
## plot(x,y) の場合
x <- pi/6*(0:12)
plot(x, sin(x)) # x の値に対する y=sin(x) の値を対応づけて描画
## オプションを追加
x <- pi/6*(0:12)
plot(x,sin(x),type="l",lwd=3,col="blue",ylab="y=sin(x)")
別のベクトルを点として重ね描きする場合
points(x, y=NULL, ...) # plotと同様なオプションが指定可
別のベクトルを線として重ね描きする場合
lines(x, y=NULL, ...) # plotと同様なオプションが指定可
文字を重ね描きする場合
text(x, y=NULL, labels, ...) # labelsに文字列を指定
## ベクトルデータの重ね描き
x <- seq(0, 4*pi, by=0.5)
y <- sin(x)
z <- cos(x)
plot(x, y, type="b", pch="x", ylim=c(-2,2), col="red") # "b"="p+l"
points(x, z, col="blue", pch="C") # 点を追加. pchは文字も指定できる
lines(x, z, col="cyan", lwd=3) # 折れ線を追加
Figure 4: ベクトルデータの重ね描き
curve()
1変数関数の描画を行う
基本書式
curve(expr, from=NULL, to=NULL, add=FALSE,
type="l", xname="x", xlab=xname, ylab=NULL, ...)
## plot(x, y=0, to=1, ...) でもほぼ同じ
expr
: 1変数関数 (関数名)from
: \(x\) 軸の左端to
: \(x\) 軸の右端add
: TRUE で重ね描きするxname
: \(x\) 軸の変数名## 関数の描画
curve(sin, from=0, to=4*pi,
col="blue", lwd=2, # グラフの線の色と太さ
xlab="time", ylab="sin/cos") # x/y軸のラベルの文字列を指定
curve(cos,
add=TRUE, # グラフを上書き
col="red", lwd=2)
Figure 5: 関数の描画
## 関数とベクトルデータの重ね描き
x <- seq(0, 4*pi, by=0.25)
y <- sin(x) + rep(c(-0.2, 0.1), len=length(x))
plot(x, y, type="p", pch="x", ylim=c(-2,2), col="red")
lines(x, y, col="blue", lwd=2) # 折れ線を追加
curve(sin, add=TRUE, col="orange", lwd=3)
Figure 6: 関数とベクトルデータの重ね描き
plot()
ベクトルデータの散布図を作成する
基本書式 (既出の機能)
plot(x, y=NULL, ...)
x
: 1種類目のデータ \(x_1,\dots,x_N\)y
: 2種類目のデータ \(y_1,\dots,y_N\)...
: “ベクトルの描画”と同じオプションが利用可能plot()
データフレーム x
の変数A,Bの散布図を作成する
基本書式
plot(B ~ A, data=x, ...)
x
: データフレームA,B
: 変数名 (データフレームの列名)x
に対して
plot(x)
を実行すると,
すべての変数のペアに対する散布図が
作成される(散布図行列; pairs()
後述)## データフレームを用いた散布図
plot(Ozone ~ Wind, data=airquality,
pch="*", col="red", cex=2) # cexは点の大きさの倍率を指定
日本語を含む図で文字化けが起こった場合
(主にMacOS)
関数 par
の family
オプションでフォントを指定
ヒラギノ角ゴシックW4を指定する場合
par(family="HiraginoSans-W4") # 数字を変えると太さが変わる
jpdata1/3.csv
(前回配布のデータ)を用いて以下の問に答えよ.
(参考) 読み込み方:
## CSVファイルは作業ディレクトリの下の data サブディレクトリにあるとする
myData <- read.csv(file="data/jpdata1.csv",fileEncoding="utf8",row.names=1)
myArea <- read.csv(file="data/jpdata3.csv",fileEncoding="utf8")
hist()
基本書式
hist(x, breaks="Sturges", freq, ...) # plotと同様なオプションが指定可
x
: ベクトルbreaks
: 区間の分割の仕方を指定.
数字を指定するとデータ範囲をその数字に近い個数に等分割する.
既定値はSturgesの公式.
詳細はヘルプを参照freq
: TRUE
(既定値)を指定すると縦軸はデータ数,
FALSE
を指定すると縦軸はデータ数/全データ数.## 関数histによるヒストグラムの作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
par(family="HiraginoSans-W4") # 日本語表示
hist(myData$気温,
xlab="", ylab="頻度",
breaks=25, # ビンの数を約25に設定
labels=TRUE, # 各ビンの度数を表示
col="green", main="気温のヒストグラム")
Figure 8: ヒストグラム
## 関数histによるヒストグラムの作図(密度での表示)
par(family="HiraginoSans-W4") # 日本語表示
hist(myData$風速, freq=FALSE, # 全体に対する割合で表示
xlab="", ylab="密度", breaks=25,
col="lightblue", border="blue", # 長方形の境界の色
main="風速の密度")
boxplot()
箱ひげ図を描画する
基本書式
boxplot(x, ...) # plotと同様なオプションが指定可
x
: ベクトルまたはデータフレーム
データフレーム x
の
変数 B
を変数 A
(質的変数; 性別・植物の種類など)で分類する場合
boxplot(B ~ A, data=x, ...)
## 関数boxplotによる箱ひげ図の作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
## 基本的な箱ひげ図
par(family="HiraginoSans-W4") # 日本語表示
boxplot(subset(myData, select=気温:風速)) # 数値データの一部を抽出
Figure 10: 箱ひげ図
## 関数boxplotによる箱ひげ図の作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
## 月ごとに気温を分類
par(family="HiraginoSans-W4") # 日本語表示
boxplot(気温 ~ 月, data=myData, col="orange", main="月ごとの気温")
## 図を回転する場合は horizontal を指定する
## boxplot(気温 ~ 月, data=myData,
## col="purple", main="月ごとの気温", horizontal=TRUE)
Figure 11: 箱ひげ図
barplot()
棒グラフを作成する
基本書式
barplot(x,width=1,space=NULL,beside=FALSE,
legend.text=NULL,args.legend=NULL, ...) # ...はplotと同様
x
: ベクトルまたは行列 (データフレームは不可)width
: 棒の幅space
: 棒グラフ間・変数間のスペースlegend.text
: 凡例beside
: 複数の変数を縦に並べるか・横に並べるかargs.legend
: 関数 legend
に渡す引数## 関数barplotによる棒グラフの作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
## 月ごとに各変数の平均を計算
par(family="HiraginoSans-W4") # 日本語表示
x <- aggregate(. ~ 月, FUN=mean,
data=subset(myData, select=c(月,気温:風速)))
## 基本的な棒グラフ
barplot(x[,2], # 棒の高さのベクトル
col="slateblue", # 棒の色の指定
names.arg=x[,1], # x軸のラベル
main=names(x)[2]) # タイトル
Figure 12: 棒グラフ
## 関数barplotによる棒グラフの作図
## 複数の棒グラフ
par(family="HiraginoSans-W4") # 日本語表示
barplot(as.matrix(x[ ,-1]), # 第1引数のデータフレームは行列にする
col=rainbow(12)[c(8:1,12:9)], # 12色に色分け
beside=TRUE, # 棒グラフを横に並べる
space=c(1.5, 3), # 棒グラフ間・変数間のスペースを指定
legend.text=paste0(x[ ,1], "月"), # 凡例の指定
args.legend=list(ncol=2)) # 凡例を2列にして表示
pie()
円グラフを作成する
基本書式
pie(x, clockwise=FALSE, ...) # plotと同様なオプションが指定可
x
: ベクトルclockwise
: 時計回りに書くか否か## 関数pieによる円グラフの作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
z <- hist(myData$日射量, breaks=5, plot=FALSE) # 5つ程度に分類
x <- z$count
y <- z$breaks
names(x) <- paste(y[-length(y)], y[-1], sep="-")
## 向きと色を調整
par(family="HiraginoSans-W4") # 日本語表示
pie(x, clockwise=TRUE, main="日射量別の日数の割合",
col=heat.colors(length(x),rev=TRUE))
covid19_tokyo.csv
(東京都の新型コロナウイルス感染動向データ)
を用いて以下の問に答えよ.
(参考) 読み込み方:
## CSVファイルは作業ディレクトリの下の data サブディレクトリにあるとする
myData <- read.csv(file="data/covid19_tokyo.csv",fileEncoding="utf8")
pairs()
散布図行列を作成する
基本書式
pairs(x, ...) # plot() でも良い
(すべての列のペアに対する散布図を行列状に配置)
x
: データフレーム
変数 A1
, \(\dots\), Ak
(列名)のみ考える場合
pairs(~ A1 + ... + Ak, data=x, ...) # plot() でも良い
## 関数pairsによる散布図の作図
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
## 表示する項目を指定
par(family = "HiraginoSans-W4")
pairs(~ 気温 + 日射量 + 風速, data=myData,
col=rainbow(12)[myData$月]) # 月毎に異なる色で表示
Figure 15: 散布図行列
persp()
3次元のグラフを2次元に射影した俯瞰図を描く
基本書式
persp(x, y, z, theta=0, phi=15, expand=1, ...) # ...はplotと同様
x,y,z
: \(x,y,z\) 座標z
は
点(x[i],y[j]
)に対応する値を
\((i,j)\) 成分とする行列で与える必要がある)theta,phi
: 俯瞰の方向を指定する極座標expand
: \(z\) 軸の拡大度## 関数perspによる2変数関数の俯瞰図
f <- function(x,y) x^2 - y^2
x <- seq(-3, 3, length=51) # x座標の定義域の分割
y <- seq(-3, 3, length=51) # y座標の定義域の分割
z <- outer(x, y, f) # z座標の計算
## 基本的な俯瞰図
## persp(x, y, z, col="lightblue")
## 俯瞰する向きを指定
persp(x, y, z, theta=30, phi=30, expand=0.5, # 俯瞰する視線の設定
col="royalblue", main=expression(z==x^2-y^2))
以下は scatterplot3d()
の例
基本書式
scatterplot3d(x, color, angle=40, ...) # ...はplotとは若干異なる
x
: \(x,y,z\) 座標を指定するデータフレームpersp()
のように直接指定することも可能)color
: 色を指定(col
ではない). 既定値は黒angle
: \(x\) 軸と \(y\) 軸の間の角度## 3次元散布図
## install.packages("scatterplot3d") # 初めて使う時に必要
library(scatterplot3d) # パッケージのロード
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
par(family = "HiraginoSans-W4")
scatterplot3d(subset(myData, select=c(風速, 日射量, 気温)),
pch=4, color="orchid")
Figure 17: 3次元散布図
legend()
グラフに凡例を追加する
基本書式
legend(x, y=NULL, legend, ...) # ...はその他のオプション
x,y
: 凡例の位置を指定 (座標やキーワードで指定が可能)legend
: 凡例の文字列ベクトルhelp(legend)
を参照help(plotmath)
を参照## 凡例の追加
f <- function(x) exp(-x) * cos(x)
plot(f, 0, 2*pi, col="red", lwd=2, ylab="")
g <- function(x) exp(-x) * sin(x)
curve(g, lty=2, # グラフの線の形式 2は破線
add=TRUE, col="blue", lwd=2)
legend(4, # 凡例の左上のx座標
1, # 凡例の左上のy座標
legend=c(expression(e^{-x}*cos(x)),expression(e^{-x}*sin(x))),
lty=c(1,2), lwd=2, col=c("red","blue"), # 指定はグラフに準拠
bty="n", # 凡例の枠線の形式(オプション) "n"は枠線なし
y.intersp=2) # 行間の指定(オプション)
Figure 18: 凡例の追加
## 日本語フォントの指定
par(family="HiraginoSans-W4")
## 東京の気候データから月ごとの気温,降水量,日射量の平均を計算し描画する
myData <- read.csv("data/tokyo_weather.csv", fileEncoding="utf8")
(x <- aggregate(. ~ 月, FUN=mean,
data=subset(myData, select=c(月,気温,降水量,日射量))))
plot(x$気温, type ="b", lwd=3, col="green", ylim=c(0, max(x$気温)+1),
xlab="月", ylab="", main="東京の気候データ", axes=FALSE) # 軸は無
axis(1, 1:12, 1:12); axis(2) # x(1),y(2)軸の作成
lines(x$降水量, type="h", lwd=3, col="blue") # 棒グラフ
lines(x$日射量, type="s", lwd=3, lty=2, col="red") # 階段グラフ
abline(0, 0, lwd=2, lty="dotted") # y=0の線を引く
legend("topleft", inset=0.02, # 左上で全体の2%(0.02)内側に良せる
legend=c("気温","降水量","日射量"),
col=c("green","blue","red"), lwd=3, lty=c(1,1,2))
Figure 19: 日本語フォントの指定
par()
グラフィクス環境の設定(複数図の配置, 余白の設定)をする
基本書式
par(tag=value)
tag
: グラフィックスパラメータhelp(par)
を参照配布したデータ
jpdata1.csv
tokyo_weather.csv
covid19_tokyo.csv
covid19_tokyo_patients.csv
を用いて以下の問いに答えよ.