ggplot2 - 手动将箱线图分面标签指定为 symbol/math 表达式

ggplot2 - Manually specifying boxplot facet labels as symbol/math expressions

我有一个名为 my_datatibble 数据框,它看起来像这样:

> my_data
# A tibble: 60 x 4
   SPECIES       simulation_id psi_hat p_hat
   <chr>                 <int>   <dbl> <dbl>
 1 Grey squirrel            74   0.527 0.306
 2 Grey squirrel           102   0.526 0.316
 3 Grey squirrel           142   0.527 0.309
 4 Grey squirrel           121   0.527 0.309
 5 Grey squirrel            25   0.526 0.317
 6 Grey squirrel            50   0.527 0.309
 7 Grey squirrel            67   0.491 0.326
 8 Grey squirrel            19   0.527 0.306
 9 Grey squirrel           174   0.527 0.302
10 Grey squirrel            46   0.527 0.309
# ... with 50 more rows

my_data中有三个不同的SPECIES

我想为每个 SPECIES 绘制 psi_hatp_hat 变量的箱线图。我开始像这样准备 tibble

my_data_plot <- my_data %>% 
    gather("psi_hat", "p_hat", key = "parameter", value = "estimate")

然后像这样绘制它:

ggplot(data = my_data_plot, mapping = aes(x = SPECIES)) +
    geom_boxplot(mapping = aes(y = estimate)) + 
    facet_grid(. ~ parameter)

这给了我:

我现在要做的是将刻面标记为实际的希腊符号,而不是例如"psi_hat" 这样 "psi_hat" 就会得到等同于 expression(hat(psi)) 的符号。

我知道在 facet_grid 中我可以使用 labeller = label_parse,但这意味着我的变量名必须是实际的表达式,但是当变量名必须是函数调用(即 hat(psi))。例如,我尝试了 my_data <- my_data %>% rename(hat(psi) = "psi_hat") 这给了我这个错误:

Error: unexpected '=' in:
"my_data <- my_data %>% 
    rename(hat(psi) ="

我也考虑过 labeller = bquote,但这似乎要求我指定行 列,因为我在此图中只有列。

所以,我想知道我是否需要或有办法为这些方面标签手动定义表达式?还是有更多的算法方法来实现这一目标?

谢谢!

这里是 my_datadput():

structure(list(SPECIES = c("Grey squirrel", "Grey squirrel", 
"Grey squirrel", "Grey squirrel", "Grey squirrel", "Grey squirrel", 
"Grey squirrel", "Grey squirrel", "Grey squirrel", "Grey squirrel", 
"Grey squirrel", "Grey squirrel", "Grey squirrel", "Grey squirrel", 
"Grey squirrel", "Grey squirrel", "Grey squirrel", "Grey squirrel", 
"Grey squirrel", "Grey squirrel", "Red fox", "Red fox", "Red fox", 
"Red fox", "Red fox", "Red fox", "Red fox", "Red fox", "Red fox", 
"Red fox", "Red fox", "Red fox", "Red fox", "Red fox", "Red fox", 
"Red fox", "Red fox", "Red fox", "Red fox", "Red fox", "Roe Deer", 
"Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", 
"Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", 
"Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", "Roe Deer", 
"Roe Deer"), simulation_id = c(74L, 102L, 142L, 121L, 25L, 50L, 
67L, 19L, 174L, 46L, 162L, 31L, 199L, 147L, 163L, 18L, 170L, 
172L, 106L, 157L, 158L, 200L, 187L, 103L, 144L, 77L, 78L, 139L, 
75L, 57L, 171L, 195L, 90L, 136L, 109L, 30L, 152L, 97L, 74L, 8L, 
161L, 73L, 130L, 151L, 150L, 184L, 198L, 177L, 97L, 88L, 123L, 
190L, 83L, 75L, 143L, 159L, 103L, 16L, 200L, 2L), psi_hat = c(0.526863413764263, 
0.525835491514182, 0.526515540307052, 0.526515540305866, 0.525668605170743, 
0.526515540309525, 0.491205525300549, 0.526863413760793, 0.527216807861263, 
0.526515540305866, 0.526515540306427, 0.526003604543373, 0.526003604547465, 
0.527039406294591, 0.491512271725946, 0.526343604414775, 0.526515540311415, 
0.490421555053814, 0.526003604541449, 0.526688801109048, 0.79766843868635, 
0.801911295111649, 0.797668438685209, 0.79766843868356, 0.736091175845588, 
0.801911294988272, 0.797668438684876, 0.797668438686537, 0.764665429923081, 
0.806326437262252, 0.769630414385322, 0.806326437300003, 0.733141462334417, 
0.801911295128621, 0.777085591061084, 0.801911295171974, 0.703578316906639, 
0.777085591642251, 0.793615265014951, 0.806326437459794, 0.662677377511043, 
0.701654360968483, 0.704629679152389, 0.70622149033349, 0.663754148939585, 
0.704629679094459, 0.705416487515374, 0.677464341430293, 0.707045218951227, 
0.662338556587023, 0.674456696561803, 0.701654360967044, 0.639650521202062, 
0.625380503760432, 0.704629679094605, 0.664561357366103, 0.704629679143759, 
0.636859548660175, 0.66375414894085, 0.707045219029558), p_hat = c(0.305763297214646, 
0.315819064091298, 0.309115591855344, 0.309115591855175, 0.317494717397372, 
0.309115591855145, 0.326303719905328, 0.305763297214592, 0.302410595448716, 
0.309115591855175, 0.309115591855139, 0.314143327866378, 0.314143327866402, 
0.304086998925611, 0.322825888575185, 0.310791594807592, 0.309115591855151, 
0.335654773573103, 0.314143327866529, 0.307439493743849, 0.0690109229482788, 
0.0677020110780009, 0.0690109229483345, 0.0690109229474338, 0.0744703724155286, 
0.0677020110840996, 0.0690109229257095, 0.0690109229256593, 0.0704604468308165, 
0.0663903378649822, 0.0691283355131073, 0.0663903378091044, 0.0737444081467713, 
0.0677020110873479, 0.0665479524846632, 0.0677020110750217, 0.073966658329169, 
0.0665479525245426, 0.0703192747621257, 0.0663903375835434, 0.166196509352831, 
0.157146399287494, 0.152026850762839, 0.14946227707946, 0.163675003941755, 
0.152026850344473, 0.150744974403108, 0.15740696035152, 0.148178744896067, 
0.167783160277052, 0.162569260757996, 0.157146399287514, 0.162501076719809, 
0.177160578693552, 0.152026850344548, 0.162149934290892, 0.152026850679299, 
0.168221557280052, 0.163675003941561, 0.148178745461308)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -60L))

你可以试试这个。因为你的数据是长格式的,所以我使用 case_when 来重命名带有表达式的变量,以便标记器读取

library(tidyverse)

df %>% 
    gather(key = "parameter", value = "estimate", -SPECIES, -simulation_id) %>%
  mutate(parameter = case_when(
    parameter == "psi_hat" ~ "hat(psi)",
    parameter == "p_hat" ~ "hat(p)"
  )) %>%
  ggplot(aes(x = SPECIES)) +
    geom_boxplot(mapping = aes(y = estimate)) + 
    facet_grid(. ~ parameter, labeller = label_parsed)

reprex 创建于 2018-08-18 包 (v0.2.0).