R+ggplot2のヒストグラム(geom_histogram)でバーの上に度数をつける


標題のことをしようと(標題をそのまま放り込むノリで)日本語で検索しても、うまく見つからず、最終的に解決したのでまとめてみました。

標準グラフだったら見つかったのですけれど。目先を変えて英語で探したら、Stack Overflowにいろいろありました。こことかこことかこことかこことか。ggplot2でグラフを描く必要がある方なら最初から英語で探せるのかもしれませんけれど、備忘録代わりに自分に要り用のコードでまとめ直しました。検索でたどり着いた人のショートカットになるでしょうし。スマートでなかったり、もっといい方法があるかもしれませんが自分には必要なものができ、また他ソフトの出力と一致しました。

例として、データフレームdatに入っている変数number(人数)でヒストグラムを描きます。20人ごとに、0〜19人、20〜39人で区間を刻んでいきます。区間の開閉にrightをつけていますがこれは古い記法でclosedを使うよう警告が出ます。2行目までで図だけは描けるわけですが、そのあとはgeom_textで付加するのかとちょっと苦闘(勘違い)しました。散布図の点にテキストラベルを付加するわけではないですね。

ggplot(dat,aes(x=number)) +
    geom_histogram(binwidth=20,boundary=0,right=FALSE) +
    stat_bin(binwidth=20,boundary=0,right=FALSE,aes(label=..count..), geom="text",vjust=-0.5)

結果的にはstat_binで。そもそもgeom_histogramは、stat_binのラッパーなんだとか。なら2行目も含めてstat_binで描けるのかもしれませんが。数値ラベル部分は3行目のレイヤーで付加しているのですが、図と同じようにするための区間をもう一度指定します(ここも無指定でしていたら数字がずれて悩んだ)。..count..が度数を格納している隠れ変数で、これをラベルにして表に出す。vjustでちょうどよさそうな場所を縦位置を指定しました。

まあ、図表示して更に数字だと情報的には冗長なのかもしれないですが、視覚的につかみたく、正確な値も知りたいこともあるとは思います。最初から普通の棒グラフで作るのが一番速い気もしなくもないが、そこは考えない。

それにしてもRで細かくチューニングされた図やら分析を追求していく方がよいのか、高機能統計パッケージやExcelでちゃっちゃとやった方がよいのかは、マークアップ言語でエディタで文書書くのかワープロ使うのかという(個人的には20年以上前からの)対立軸に似ていて悩ましいところです。道具は目的のためにあるものだし、時間は有限ですしね。まあ、道具そのものやガジェットが好きなのは人後に落ちないのですが。RもPythonもようやくIDEベースの利用に慣れてきましたが、習得しなければいけないことはいつまでもなくならないですね。

コメント

このブログの人気の投稿

ロバート・パットナム/デヴィッド・キャンベル『アメリカの恩寵』刊行について

『アメリカの恩寵』読解のためのリンク集