備忘ログ

チラシの裏的備忘録&メモ

Rのggplot2でデータにない値を凡例に反映させるメモ2

ggplot2パッケージの3.5.x以降で仕様変更があり、データ中に存在しない値を凡例に反映させるためには、以前の手法ではうまく行かなくなったので、現在動く手法のメモ。

例としてmtcarsデータの気筒数を因子型にしたものを用意して、グラフ化する。

library(ggplot2)
mtcars <- mtcars |> 
  dplyr::mutate(cyl = factor(cyl, levels = 4:8))
ggplot(mtcars) +
  geom_point(aes(x = mpg, y = disp, color = cyl))

データ中に、5気筒、7気筒がないので凡例には反映されていない。でも、5気筒や7気筒の車も世の中にあるわけなので、データ中にないだけで凡例には凡例には合ったほうがいいなとおもうこともある。

ドキュメントを一見すると、scale_color_*()scale_fill_*()などの中でdrop = FALSEと指定することで存在しないデータを凡例に反映することができそうだが、これだけでは次の通り、凡例に数字は反映されているがポイントは反映されなくなってしまう。

ggplot(mtcars) +
  geom_point(aes(x = mpg, y = disp, color = cyl)) +
  scale_color_hue(drop = FALSE)

これを解決するには、追加でgeom_*()show.legend = TRUEとするといい

ggplot(mtcars) +
  geom_point(aes(x = mpg, y = disp, color = cyl), show.legend = TRUE) +
  scale_color_hue(drop = FALSE)

ドキュメントを読むとちゃんと書いてるのだが、わかりにくく、ISSUEでも時折取り上げられている。

github.com

完全に存在しない値を加えたいならlimitsで細かく指定するといく。

ggplot(mtcars) +
  geom_point(aes(x = mpg, y = disp, color = cyl), show.legend = TRUE) +
  scale_color_hue(limits = c(4:8, "ALL"))

参考までに以前の手法は次の通り

indenkun.hatenablog.com