ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

2つのカテゴリー変数をグラフにする(ggplot2パッケージ)[R]

ggplot2パッケージ(tidyverseパッケージに含まれている)のdiamondsデータを使う。

> library(tidyverse)
> head(diamonds)
# A tibble: 6 x 10
  carat cut       color clarity depth table price     x     y     z
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1  0.31 Good      E     SI1      63.3  55     544  4.33  4.36  2.75
2  0.8  Very Good H     VS2      59.1  59    2953  6.02  6.07  3.57
3  0.78 Very Good H     VS1      61.9  57.1  2854  5.87  5.95  3.66
4  0.3  Ideal     G     VVS2     61.5  57     684  4.29  4.33  2.65
5  1.5  Good      F     SI2      59.7  61    8181  7.39  7.44  4.43
6  1.2  Very Good E     SI2      61.4  58    6130  6.81  6.88  4.2 
  • carat:重さ(カラット)
  • cut:カットの質(5段階)
  • color:色(7段階)
  • clarity:透明度(8段階)
  • depth \frac{2z}{(x+y)}
  • table:最も幅広い部分に対する最上部の幅
  • price:値段(USD)
  • x, y, z:それぞれ長さ・幅・高さ(mm)

geom_jitter( )で点をずらして描く

2次元の散布図を普通に描いても多くの点が重なってしまっていくつあるのか分からないので多少ずらして描いたもの。
diamondsデータをそのまま使うとサンプル数が多すぎるので少し間引いた。

geom_jitter( )では次のような引数を指定できる。

※ プロットマーカーについては以前まとめた記事があります(2022-07-17 追加)

necostat.hatenablog.jp

alphaでマーカーの透過度を上げてやると、密なところの様子は少し見やすくなる。

diamonds %>% sample_n(size=10000) %>%
ggplot(aes(x = cut, y = color)) +
  geom_jitter(height = 0.3, width = 0.3,
              alpha = 0.2, shape = 20, color = "darkcyan")

図1:点をランダムにずらしてプロットした

geom_count( )で各カテゴリーの合計数をプロットする

各カテゴリーの合計数を点の大きさで表してプロットするもの(バブルチャート)。

色やマーカーの種類などに関する引数(shape, size, colour, stroke, fill, alpha)についてはgeom_jitter( )を参照。

ggplot(data = diamonds, aes(x = cut, y = color)) +
  geom_count()

図2:各カテゴリーの合計数をプロットした

stat_sum( )との対応

カテゴリー変数をグラフにする場合は、だいたいカテゴリーごとに合計や割合として集計した値を使う。1次元の場合はstat_count()で集計が行われ、これはgeom_bar()というグラフの形状を決めるレイヤーと対応している。 2次元の場合はstat_sum()が各セルごとに集計して、geom_point()で点をプロットする。

次のコードは前述のgeom_count( )と同じグラフを作成する。

ggplot(data = diamonds, aes(x = cut, y = color)) +
  geom_point(stat="sum")

ggplot(data = diamonds, aes(x = cut, y = color)) +
  stat_sum(geom = "point")

おわりに

  • ggplotの使い手としてもう一歩成長するためにはstat_*( )の理解は必要不可欠
  • 寒くなってネコが布団に入ってきてくれるようになりました

参考資料

  • 本家ページ:

ggplot2.tidyverse.org

  • geom_*stat_*の関係が詳しくまとめられています

ggplot2のstat_*()関数についてのまとめ - Qiita