先日、仕事上でRでヒストグラムを作る機会があったので、作業手順をここに記します。
(なお、R初心者ですので間違い等あればご指摘ください)
データの読み込み
まずデータはエクセルだったので
data1 <- read.xlsx("hoge.xlsx",1)
でとりあえずデータを読み込みました。
(hoge.xlsxというエクセルファイルを読み込んでdata1というデータフレーム格納)
ただ、読み込みにすごい時間がかかった。一度csvに吐き出してread.csvで読み込んだ方が少しは早くなるかな。
ヒストグラム作成
データがよみこめたらヒストグラムの作成ですが、これは以外にも簡単。
hist(data1$hogehoge)
この1行でデフォルトのヒストグラムはかけました。
($の後ろはデータフレームの中のヒストグラムを描画するデータのカラム名)
ヒストグラムを装飾
hist関数にいろいろ装飾を加えて、グラフに色をつけたりタイトルとかラベルとかつけてそれっぽく仕上げることができました。
hist1 <- hist(dat1$v,col ="#ff00ff40" , border = "#ff00ff", breaks = k,main ="title",xlab ="V(m/s)",cex.main=2)
(col:グラフの色をRRGGBBAAで指定
border:グラフの枠の色をRRGGBBで指定
breaks:グラフの区分数を指定。今回はスタージェスの公式で求めた区分数を変数kに格納)
main:タイトル
xlab: x軸のラベル
cex.main:タイトルのフォントサイズ)
※スタージェスについては(こちら)を参考にしました
2つのヒストグラムを重ねて描画
別のデータとも並べて比較したかったので重ね合わせました
hist2 <- hist(data2$v,col ="#0000ff40" , border = "#0000ff", breaks = k,add=T )
(add:既に描画してるグラフに重ねて描画するかをTRUE or FALSEで指定)
凡例をつける
凡例は以下のようにつけました
labels <- c("data1","data2")
legend("topright",legend=labels,col=color,pch=15,cex=1)
(labelsに凡例名をベクトルで格納
"topright":凡例の場所。toprightで右上、bottomleftで左下など
legend:凡例の項目。labelsに格納しておいた2項目を表示させている
col:凡例内のオブジェクトの色
pch:凡例内のオブジェクトの形
cex: 凡例の文字サイズ)
ここから手間取った部分
ここまでは良かったものの、このグラフの上部に各値を入れたいと思った。
調べるとhist関数内にlabel=T
を追加するだけでいいとのことだったので、data1、data2のヒストグラムを描く関数にlabel=Tを追加しました。
うん。まずまず。
しかし、data1とdata2の差が小さいと、グラフ右部のように数値が重なってしまっている。
さらにいえば、data1のラベルは赤文字、data2のラベルは青文字で2段で示したい。
そこで、いろいろ調べまくったが、どうもlabel=Tで表示したラベルのプロパティを変更する手段はないようで、解決策は見当たりませんでした。
別の策として、テキストを挿入する方法があるようなのでそちらを試した
まず、ヒストグラムを描いたときに戻り値として以下の情報が見られる。(以下はhist1の戻り値)
$breaks
[1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13
$counts
[1] 37 157 313 445 472 354 230 131 71 36 12 1 2
$density
[1] 0.0163644405 0.0694383016 0.1384343211 0.1968155683 0.2087571871
[6] 0.1565678903 0.1017249005 0.0579389651 0.0314020345 0.0159221583
[11] 0.0053073861 0.0004422822 0.0008845644
$mids
[1] 0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5
$xname
[1] "dat20khz$v"
$equidist
[1] TRUE
attr(,"class")
[1] "histogram"
(breaks: 階級の閾値
counts: 各階級のデータ個数
density:各階級のデータ密度(?)
mids:各階級の中央値(?)
あとの情報は特に関係しなさそうだったので気にしませんでした・・・)
続いて、上の情報から必要なものをtextに入れ込む。
textの基本的な書き方としてはtext(x軸方向の位置, y軸方向の位置, labels="文字列")
なので
text(hist1$mid,hist1$counts,hist1$counts,cex=0.8,pos=3,col="red")
text(hist1$mid,hist1$counts-max(hist1$counts)*0.02,hist50$counts,cex=0.8,pos=3,col="blue")
としました。
(x軸方向の位置はバーの中央にしたいので、hist$mid、
y軸方向の位置はバーの頭の上にしたいので、hist$counts
表示させる文字列はデータの個数なので、hist$counts
cex: 文字サイズ
pos: 文字の位置をデフォルトより少し上にしたいので3
col:文字の色)
ということで最終的に出来上がったのはこちら
思っていた通りのものができたのはできた。
せっかくhist関数内にラベルの引数があるんやから、ラベルの設定もできたらいいのに・・・。(だれかご存知なら教えてください。)
結局、縦軸に数値が描いてるからバー一本一本に対するラベルはあまり需要ないのかな。
あくまで簡易的に描画させるだけで、詳細な設定のラベルはtextでやってね。ってことなんかな
ということでRでヒストグラムを描いてみた記事でした。