カテゴリカルな値をx軸に指定するとプロット時に困ることがある
たとえば以下のようなデータから箱ひげ図を作る場合
library(tidyverse)
d <- tibble(
id = 1:2000,
Group = rep(c("SS", "TT", "MM", "SW", NA), each = 400),
Value = {set.seed(1); lapply(1:5, rnorm, n = 400, sd = 1)} %>% unlist()
)
g <- ggplot(data = d, aes(x = Group, y = Value)) +
geom_boxplot()
ggsave(g, filename = "g.png")
このように、
- x軸がアルファベット順になっているためわかりにくい
- NAの見栄えが悪い
という問題が生じる。この解決例。
もちろんデータフレームを整形してしまう方法もあるが、ここではプロット部分のコードで対応する方法を示す。
x軸に指定したカテゴリカルな値を平均値で並べ替える:forcats::fct_reorder
Source: Cheatsheets - Posit (https://posit.co/resources/cheatsheets/)
参考:Reorder factor levels by sorting along another variable
各カテゴリ内の値を特定の関数で要約し、その値をもとにカテゴリを並べ替えて因子の水準とします。
要約関数はデフォルトではmedian
なので、そのまま箱ひげ図の描画に使えます。
g_reorder <- ggplot(data = d, aes(x = fct_reorder(Group, Value), y = Value)) +
geom_boxplot()
ggsave(g_reorder, filename = "g_reorder.png")
x軸にNAが入っている場合の対処:forcats::fct_explicit_na
Source: Cheatsheets - Posit (https://posit.co/resources/cheatsheets/)
参考:Make missing values explicit
NAを含んだ文字列をそのままas.factor
してもNAに該当する列には水準が与えられませんが、fct_explicit_na
を使用するとNAに対して特定の水準を与えることができます。
これを利用するとNAに該当する部分を最後尾にしたまま水準名を明示的なものに変更できます。
g_explicit_na <- ggplot(data = d, aes(x = fct_explicit_na(Group, "UN"), y = Value)) +
geom_boxplot()
ggsave(g_explicit_na, filename = "g_explicit_na.png")
forcats1.0.0ではfct_explicit_na
に代わってfct_na_value_to_level
の使用が推奨されているそうです。
参考:Convert between NA values and NA levels