【ggplotメモ10】ヒストグラムを描く

今日はirisデータを使ってヒストグラムを書きたいと思います(データの読み込み方はリンク先の記事をご覧ください)。今回は花びらの長さの分布を見てみましょう。

まずは、花の種類のことは考えずに描いてみます。

# ggplot2の読み込み 
library( ggplot2 ) 

# グラフの基本設定 
ggplot() + theme_set( theme_classic(base_size = 12, base_family = "Hiragino Kaku Gothic Pro W3") ) 

h1 = ggplot( iris, aes( x = Petal.Length ) ) + 
  geom_histogram( binwidth = 0.2 ) 

plot( h1 )

横軸は花びらの長さ、縦軸は度数(各長さのデータがいくつあったか)です。

「グラフの基本設定」のところでテーマをclassic、フォントサイズを12、フォントをヒラギノ角ゴシックにしています。ここは好きなものを設定してください(何も設定しなかった場合は、ggplotがデフォルトのデザインで描いてくれます)。

そして、ggplot()の中で使うデータセットの名前、x軸に何を持ってくるかを指定します。加えて、次の行でgeom_histogram()と書けばOKです。ここでは、ヒストグラムのバー1本あたりの太さをbinwidth = 0.2としました。ここの数字を変えれば好きな太さにすることができます。特に何も指定しなければ、ggplotが適当に描いてくれます。

irisデータでは3種類のお花の情報が入っているのですが、今描いた図ではそれらが一緒くたになっています。今度は花の種類で色分けをしてみましょう。

h2 = ggplot( iris, aes( x = Petal.Length, color = Species, fill = Species ) ) + 
  geom_histogram( position = "identity", binwidth = 0.2, alpha = 0.5 ) 

plot( h2 )

先ほどのh1にちょっとだけ加筆しました。まず、ggplot()の中のaes()で、枠線と塗りつぶしをSpecies(花の種類)によって分けるように指示しました(color = とfill =)。次に、geom_histogram()の中にposition = とalpha = を付け加えました。position = “identity”は3種類のヒストグラムを独立に描くことを意味しています。これをつけなくても描けるのですが、ヒストグラム同士が重なったときに見辛くなるので、つけておいた方がいいかなと思います(どう見辛くなるかは試しにやってみてください)。そして、alpha = を指定することでバーを透け透けにしています。透け透けにしていないとヒストグラムが重なってしまった場合にどちらかが見えなくなってしまうので、つけておいた方がいいかなと思います。それに、透けさせると色が淡くなって可愛いです。alpha = のところの数字を小さくすればするほど薄くなります(薄くしすぎるとそれはそれで見辛いので、加減が必要です)。

さて、ggplotではヒストグラムに確率密度曲線を重ねて描くことができます。ggplotで確率密度曲線をつけるには、geom_density()を使います。先ほどのコードにgeom_density()を付け足してみましょう。

h3 = ggplot( iris, aes( x = Petal.Length, color = Species, fill = Species ) ) + 
  geom_histogram( position = "identity", binwidth = 0.2, alpha = 0.5 ) + 
  geom_density( alpha = 0.5 ) 

plot( h3 )

ただ、geom_density()を付け足すだけだと、この図のようにヒストグラムと確率密度曲線が一致しないものが出来上がります(めっちゃ下の方に山が描かれています)。それもそうですね。ヒストグラムの縦軸と確率密度曲線の縦軸の単位が異なるからです。ヒストグラムと確率密度曲線を合わせるために、グラフの縦軸の単位を密度の方に揃えましょう。

h4 = ggplot( iris, aes( x = Petal.Length, y = ..density.., color = Species, fill = Species ) ) + 
  geom_histogram( position = "identity", binwidth = 0.2, alpha = 0.5 ) + 
  geom_density( alpha = 0.5 ) 

plot( h4 )

はい、できました。グラフの縦軸の単位を密度の方に揃えるには、ggplot()の中のaes()でy = ..density..と書きます(ピリオド2つずつを忘れずに)。

それでは、今日はこの辺で。描いた図の保存を忘れないようにしましょうね。

savePlot = function( data, name, dpi, width, height ){ 
  ggsave( plot = data, file = name, dpi = dpi, width = width / dpi, height = height / dpi ) 
} 
savePlot( h1, "figure/plot8.png", 300, 1500, 1500 ) 
savePlot( h2, "figure/plot8a.png", 300, 1500, 1500 ) 
savePlot( h3, "figure/plot8b.png", 300, 1500, 1500 ) 
savePlot( h4, "figure/plot8c.png", 300, 1500, 1500 )