情報科学と人工知能のノート

初等的な知識から最新論文の解説まで色々集めていきます.備忘録兼用.

R 備忘録 2013/05/10

データを視覚化する方法について、軽くまとめ。

とりあえずベクトルの値を並べる

plot 関数を使うとベクトルの要素をインデクス順にプロットすることができます。

> plot(c(1:5, 5:1))

ちなみにうちの環境では出力はこのようになりました。
f:id:ti2236:20130510145200p:plain
グラフを画像に保存するには png, jpeg などといったファイル形式と同名の関数を使用します。

> png(filename="r_plot.png") # デバイスを開く
> plot(c(1:5, 5:1))
> dev.off() # デバイスを閉じる

引数 type に "p" を入れると点でプロットされ、"l" を代入すると折れ線が描かれます。
"o" を入れると点と線の両方で描画されます。
他にもありますが、そんなに使わないのではないかと。

散布図を描く

2次元散布図を書くときにも plot 関数を使います。
table のように横軸成分を表すベクトルと縦軸成分を表すベクトルをそれぞれ与えてもよいですし、2列の行列(第一列が横軸成分で第二列が縦軸成分)を与えてもよいです。
以下の二行は(ラベル等を除いて)どちらも同じ結果になるはずです。

> plot(c(1:5, 5:1), c(1:10), type="o")
> plot(matrix(c(1:5, 5:1, 1:10), 10, 2), type="o")

f:id:ti2236:20130510150226p:plain

関数を描く

plot に関数を与えれば、関数をグラフ化することができます。

> plot(function(n) return (n))

横軸の下限・上限はそれぞれ第二引数、第三引数に与えます。

plot 関数は引数の構造が不思議ですね。
総称関数というやつでしょうか。

ヒストグラムを書く

hist 関数でデータの度数分布のヒストグラムを出力できます。

> # 人間の性別と身長と体重が並んだ個表データを作る。
> # 値は適当です。
> sex <- c("F", "F", "M", "F", "M", "M", "F", "M", "F", "F")
> height <- c(154, 145, 170, 167, 180, 165, 160, 177, 148, 162)
> weight <- c(48, 40, 50, 52, 80, 75, 48, 66, 58, 51)
> people <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight)
> hist(people$HEIGHT)

データの区切り幅を変えたいときには breaks にベクトルを与えます。

# ヒストグラムの階級幅を 10 にする。
hist(people$HEIGHT, breaks=seq(130, 190, by=10))
# 身長 170 cm 以下の人と 170 cm より大きい人を数えるヒストグラムを作る。
hist(people$HEIGHT, breaks=c(130, 170, 190))

一方、度数分布表を折れ線グラフで表示するのは単純ではありません。
ベクトルの要素を先頭から順にプロットしていく plot 関数を使うために、データを加工しなければいけません。
もっと簡単な方法があれば教えてください。
なお、棒グラフを書くための barplot という関数もあります。

# 度数をプロット
> height_freq <- cut(people$HEIGHT, breaks=seq(130, 190, by=10))
> plot(table(height_freq), type="l")
# 累積度数をプロット
> plot(cumsum(table(height_freq)), type="l")
> barplot(cumsum(table(height_freq)))

ちなみに hist や plot の戻り値もオブジェクトです。

> (h <- hist(people$HEIGHT, breaks=seq(130, 190, by=10)))
$breaks
[1] 130 140 150 160 170 180 190

$counts
[1] 0 2 2 4 2 0

$intensities
[1] 0.00 0.02 0.02 0.04 0.02 0.00

$density
[1] 0.00 0.02 0.02 0.04 0.02 0.00

$mids
[1] 135 145 155 165 175 185

$xname
[1] "people$HEIGHT"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"
> mode(h)
[1] "list"

再描画はどうすればいいんでしょうか?

ラベルの付け方

plot, hist, barplot のいずれも、引数 xlab や ylab に文字列を与えることによって軸のラベルをつけることができます。

> plot(1:10, xlab="x", ylab="y")