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でも時折取り上げられている。
完全に存在しない値を加えたいならlimitsで細かく指定するといく。
ggplot(mtcars) + geom_point(aes(x = mpg, y = disp, color = cyl), show.legend = TRUE) + scale_color_hue(limits = c(4:8, "ALL"))

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