facet_grid(switch = ‘y’)を指定するとstripの文字の角度が変更できない

facet_gridでstripの位置を変えた時は、theme()の引数に注意する
facet
R
ggplot2
Published

April 18, 2022

Modified

November 22, 2024

TL;DR

facet_grid(switch)でストリップの方向を変えた時は、文字角度を変更する際にtheme()の引数に注意する。

経緯

表題の通り、ggplot2パッケージのfacet_grid(switch = "y")を指定した際に、theme()strip.text.y = element(angle = 0)などでstripの文字の見栄えを変更できずにハマった。 例としては次の様なプロットを作成したときに、

library(ggplot2)

theme_mini <- function(size = 12) {
  list(
    theme_minimal(),
    theme(
      panel.grid = element_blank(),
      panel.background = element_rect(color = "black"),
      text = element_text(size = size),
      strip.text = element_text(size = size + 4, face = "bold")
    )
  )
}

gp1 <-
  ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  facet_grid(rows = vars(Species)) +
  theme_mini()
gp1

種名が書かれたストリップを右側から左側に移動させたいときには、以下の様にfacet_grid(switch = "y")を指定するとできる。

gp2 <- gp1 + facet_grid(rows = vars(Species), switch = "y")
gp2

このとき、移動させたストリップの文字の向きを変えたい(例えば文字が水平になる様に回転させたい)とおもって、theme(strip.text.y = element_text(angle = ~))を変えても、変更が反映されなかった。

gp2 + theme(strip.text.y = element_text(angle = 0))

解決

以下のリンク先のGithub issueを見つけて解決した。

要は指定するtheme()の引数が間違っていて、theme(strip.text.y.left)を指定しなければいけなかったらしい。

gp2 + theme(strip.text.y.left = element_text(angle = 0))

ハマった原因としては、公式のReferenceサイトにもこの引数のことは書かれていない様だし、theme()のタブ補完の候補でも出てこなかったので気付かなかった、というのが大きな要因だと思う。

以下のように追記されていました。こちらのコミットで変わったようです。

As a consequence, some theme stylings need to be applied to the position-dependent elements rather than to the parent elements

二つ目のIssueをみると、ggplot2=v3.3.2から導入されたようです。NEWS.mdに記載されていました(PR)

また、一つ目のIssueでも示されていますが、いくつかのテーマ要素は親のテーマを引き継ぐことができ、例えば文字色はstrip.text.yで指定しても変更されるようです。(ややこしい。)

gp2 + theme(strip.text.y = element_text(angle = 0, color = "red"))

一方でfacet_wrapの場合とは異なり、facet_grid(switch = "x")で上下のストリップを配置転換をした場合は、strip.text.xで方向を変更できるようです。(これまたややこしい。)

gp3 <-
  ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  facet_grid(cols = vars(Species), switch = "x") +
  theme_mini()
gp3

gp3 + theme(strip.text.x = element_text(angle = 15, color = "red"))

Session information

sessionInfo()
R version 4.3.2 (2023-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Asia/Tokyo
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
[1] ggplot2_3.5.1

loaded via a namespace (and not attached):
 [1] vctrs_0.6.5      cli_3.6.3        knitr_1.48       rlang_1.1.4     
 [5] xfun_0.46        generics_0.1.3   renv_1.0.10      jsonlite_1.8.8  
 [9] labeling_0.4.3   glue_1.7.0       colorspace_2.1-1 htmltools_0.5.7 
[13] scales_1.3.0     fansi_1.0.6      rmarkdown_2.25   grid_4.3.2      
[17] evaluate_0.24.0  munsell_0.5.1    tibble_3.2.1     fastmap_1.1.1   
[21] yaml_2.3.9       lifecycle_1.0.4  compiler_4.3.2   dplyr_1.1.4     
[25] pkgconfig_2.0.3  farver_2.1.2     digest_0.6.34    R6_2.5.1        
[29] tidyselect_1.2.1 utf8_1.2.4       pillar_1.9.0     magrittr_2.0.3  
[33] withr_3.0.0      tools_4.3.2      gtable_0.3.5