2015年2月19日木曜日

Rでヒストグラムの上に度数の数字を表示する

例えば、↓こんなヒストグラムがあったとしましょう。

普通にhist関数で描画したもの。 30~40、40~50の階級の度数はゼロ?

ぱっと見、30~40と40~50の階級の度数はゼロなんだな、と見えちゃいますが、そうではありません。

↓実はこんなスクリプトでサンプルデータを作ったので、

d <- c(rep(5,10000), rep(15, 1000), rep(25, 100), rep(35,10), rep(45,1))
hist(d, breaks=seq(0,50,10))


30~40の階級には10の度数、40~50の階級には1の度数があるんですよね。でも、0~10の階級の10000の度数が多すぎるために、つぶれて見えなくなってしまったという状態。

こんなときは、棒グラフの上のところに度数の数字を表示させてやれば、少ない度数の階級についても確認ができます。

hist(d, breaks=seq(0,50,10), labels=T)

hist関数にlabels=Tオプションを指定し、度数を表示させたもの

labels=T オプションを指定するだけなので、とても簡単です。

が、実は私、このオプションの存在を知らず、いままで↓下記のような方法で書いてました。(このへんの紆余曲折が、この記事を書こうと思い立った理由だったりします)

h <- hist(d, breaks=seq(0,50,10))
text(h$mids, h$counts, h$counts)

hist関数の戻り値を、text関数を使ってプロット

hist関数の戻り値(変数hに格納してます)には、階級値や度数の情報が入っているので、それをtext関数で表示させるというもの。

文字と棒グラフのborderが重なって見にくいと思う場合は、↓こうやればOK。

h <- hist(d, breaks=seq(0,50,10), ylim=c(0,10100))
text(h$mids, h$counts, h$counts, pos=3)

文字が棒グラフの線と重ならないようにしたもの

text関数のオプションに pos=3 をつけてやれば、テキストの描画位置が指定座標のやや上側になります。さりげなく、y軸の範囲を広げている(ylim=c(0,10100)のところ)のは、こうしないと数字の上部が切れてしまうから。

labels=T 指定と同じようなヒストグラムが描けたものの、いろいろと面倒くさいですね。

ただ、この方法にも良い点があって、それは表示する数字を加工することができるというものです。手作りだから当たり前なのですが。

↓こんな感じ。

h <- hist(d, breaks=seq(0,50,10), ylim=c(0,10100))
text(h$mids, h$counts, paste(h$counts/1000, "千"), pos=3)

棒グラフの上に表示する数字に加工を施したもの

度数を1000で割るという演算を行い、単位として「千」という文字を追加しました。

表示する数字をいろいろとカスタマイズしたい場合は、この方法でやるとよさそうです。




0 件のコメント:

コメントを投稿