cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

ggplot2でのfacetした図のstripを下部に配置する方法と注意点

ggplot2のfacet_wrap()facet_grid()で、ある変数の水準ごとにパネルを分割した描画を行うと、分割の基準となっている変数名がパネルの上部に表示されます。これにはstripという名前がついています。“strip”の辞書を引くと「(金属の)薄板」の意味だそうです(確かに分割した様子は板っぽい…)。

stripの位置は、facet_wrap()facet_grid()それぞれ異なる方法で調整できます。まずはfacet_wrap()の例を示します。次のようにfacet_wrap(strip.position = "bottom")とすることでstripを下部に移動させることができます。できますが…。

library(ggplot2)
library(gghighlight)

p_base <- 
  ggplot(mpg, 
       aes(displ, hwy, color = class)) +
  geom_jitter() +
    gghighlight(use_direct_label = FALSE,
                unhighlighted_colour = "#99999930") +
  hrbrthemes::scale_color_ipsum() +
  guides(color = FALSE)

p_strip_bottom <- 
  p_base +
  facet_wrap(vars(class),
             ncol = dplyr::n_distinct(mpg$class),
             strip.position = "bottom")
p_strip_bottom +
  ggtitle('strip.position = "bottom"だけではx軸の数値ラベルの上部にきてしまう')

f:id:u_ribo:20190224145624p:plain

「違う、そうじゃない」。

stripがx軸のラベルより上にきており、肝心の値がわかりにくくなってしまっています。

そもそもstripの位置は図の上部にあったほうが良いんじゃ…という気がしますが、ここでは諸事情により下部に配置する必要があるとして話を続けます。

次にもう一つのfacetであるfacet_grid()でstrip位置を調整します。こちらは引数switchがラベルの位置指定に使われており、NULL (初期値), “x”, “y”, “both”のいずれかを与えます。デフォルトではstripの配置はパネルの上部・右側ですが、“x”の時は、縦方向にパネルを分割したstripの位置を下部に、“y”が与えられた時には横方向に分割されたstripを左側に配置します。また縦・横両方向にラベルを与える場合でstripを下部・左側にするには“both”を与えます

p_base +
  facet_grid(cols = vars(class), switch = "x") +
  ggtitle('switch = "x"でもx軸の数値ラベルの上部にきてしまう')

f:id:u_ribo:20190224145653p:plain

この問題を解決し、x軸の下にstripを表示するには、下記のようにtheme(strip.placement = "outside")でstripを外側に配置する指定を追加します。これはfacet_wrap()facet_grid()のいずれで作成した場合でも共通です。

p_strip_bottom + 
  # strip.placementは "inside" (初期値) または "outside"が指定可能
  theme(strip.placement = "outside",
        strip.background = element_blank())

f:id:u_ribo:20190224145756p:plain

整理すると、

  • stripの位置を変更するには
    • facet_wrap()ではstrip.position =
    • facet_grid()ではswith =
  • 下部に配置したstripを移動するにはtheme(strip.placement = "outside")

とfacetの処理により異なり、さらにtheme()で調整が必要なのでややこしいです。

参考

atusy.github.io

facetについての全般的な話題はこれを見ておけば大体OKだと思います。逆引き的に参照してもよし。

notchained.hatenablog.com

facet_wrap(strip.position = )facet_grid(swith = )の話題に触れられています。

それでは!