在 facet_wrap() 中更改标签时使用上标

Using superscript when changing labels in facet_wrap()

我正在使用 facet_wrap() 在一页上绘制 7 种空气质量污染物。我想将数据框中使用的缩写(例如“PM”)中的各个绘图标签重命名为长格式(例如“Fine Particulate Matter (ug/m3)”),并希望在其中包含一个上标标签 (ug/m^3)。更改标签时找不到合并上标的方法。

我的没有上标的代码工作正常:

> SeasonalMean
    Pollutant Season       mean        cv
 1:       SO2 Winter  4.3594786 1.2606103
 2:        NO Winter  4.8086810 1.3138420
 3:       NO2 Winter 13.4610992 0.4983027
 4:       NOX Winter 18.2377363 0.6503697
 5:        CO Winter  0.2578629 0.3373904
 6:        O3 Winter 25.0978910 0.4094255
 7:        PM Winter  9.4271302 0.5599974
 8:       NOX Spring 14.1144831 0.6320194
 9:        CO Spring  0.2198282 0.2964914
10:        O3 Spring 26.2944466 0.3021818
11:        PM Spring  7.7559475 0.5107155
12:       SO2 Spring  2.7709979 1.5018185
13:        NO Spring  3.3221394 1.4227275
14:       NO2 Spring 10.7621779 0.4771676
15:        CO Summer  0.2332291 0.3337901
16:        O3 Summer 25.8531689 0.3426781
17:        PM Summer  8.5609107 0.5751629
18:       SO2 Summer  3.2485138 1.3612882
19:        NO Summer  4.3011274 1.6905351
20:       NO2 Summer 11.4917325 0.4739557
21:       NOX Summer 15.8515746 0.7333461
22:        O3   Fall 25.3569794 0.3529466
23:        PM   Fall  8.0808294 0.5460776
24:       SO2   Fall  3.7543985 1.3780758
25:        NO   Fall  3.1074317 1.1202237
26:       NO2   Fall 11.8911633 0.4549728
27:       NOX   Fall 15.0387167 0.5627663
28:        CO   Fall  0.2378491 0.2780384

new_labels <- c("CO" = "Carbon Monoxide (ppb)", "NO" = "Nitric Oxide (ppb)", "NO2" = "Nitrogen Dioxide (ppb)", "NOX" = "Nitrogen Oxides (ppb)", "O3" = "Ground-Level Ozone (ppb)", "SO2" = "Sulphur Dioxide (ppb)", "PM" = "Fine Particulate Matter (ug/m^3)")

p1 <- ggplot(SeasonalMean, aes(x = Season, y = mean)) +
  facet_wrap(~ Pollutant, scales = "free", labeller = labeller(Pollutant = new_labels)) +
  geom_point() +
  labs(title = "Average Seasonal Air Pollutant Concentrations in Hamilton Downtown (2017)", x = "Season", y = "Mean") +
  theme(axis.text.x = element_text(angle = 90, vjust=0.5), plot.title = element_text(hjust = 0.5))

我查看了其他一些问题,但找不到在使用上标的同时组合更改方面标签的任何问题:How do I include a superscript to texts on a plot on R?, Superscript in R, Subscripts in plots in R, How to change facet labels?

我的尝试包括在制作标签名称列表时使用 expression() 和 bquote():

new_labels <- c("CO" = "Carbon Monoxide (ppb)", "NO" = "Nitric Oxide (ppb)", "NO2" = "Nitrogen Dioxide (ppb)", "NOX" = "Nitrogen Oxides (ppb)", "O3" = "Ground-Level Ozone (ppb)", "SO2" = "Sulphur Dioxide (ppb)", "PM" = expression("Fine Particulate Matter (ug/m^3)"))

但这只是使整个列表成为一个表达式:

> new_labels
expression(CO = "Carbon Monoxide (ppb)", NO = "Nitric Oxide (ppb)", 
    NO2 = "Nitrogen Dioxide (ppb)", NOX = "Nitrogen Oxides (ppb)", 
    O3 = "Ground-Level Ozone (ppb)", SO2 = "Sulphur Dioxide (ppb)", 
    PM = "Fine Particulate Matter (ug/m^3)")

我还尝试在 facet_wrap() 的 labeller() 参数中使用 expression() 和 bquote(),但这会导致绘图标签的 none 发生变化:

p1 <- ggplot(SeasonalMean, aes(x = Season, y = mean)) +
  facet_wrap(~ Pollutant, scales = "free", labeller = labeller(Pollutant = expression(new_labels))) +
  geom_point() +
  labs(title = "Average Seasonal Air Pollutant Concentrations in Hamilton Downtown (2017)", x = "Season", y = "Mean") +
  theme(axis.text.x = element_text(angle = 90, vjust=0.5), plot.title = element_text(hjust = 0.5))

抱歉,我无法包含任何地块图片,在此先感谢!

ggtext 试试这个 tidyverse 解决方案。这意味着数据框中的标签与向量中的标签相似。然后加入它们并使用新添加的变量,其中包含 facet 选项内的标签。之后,您可以将条带文本格式化为 class element_markdown()。这里的代码:

library(tidyverse)
library(ggtext)
#Labels
Datalabels <- data.frame(Pollutant=c("CO","NO","NO2","NOX","O3","SO2","PM"),
                         Lab=c("Carbon Monoxide (ppb)","Nitric Oxide (ppb)","Nitrogen Dioxide (ppb)",
                               "Nitrogen Oxides (ppb)","Ground-Level Ozone (ppb)","Sulphur Dioxide (ppb)",
                               "Fine Particulate Matter (ug/m^3)"),stringsAsFactors = F)
#Plot
SeasonalMean %>% left_join(Datalabels) %>%
  ggplot(aes(x = Season, y = mean)) +
  facet_wrap(~ Lab, scales = "free") +
  geom_point() +
  labs(title = "Average Seasonal Air Pollutant Concentrations in Hamilton Downtown (2017)",
       x = "Season", y = "Mean") +
  theme(axis.text.x = element_text(angle = 90, vjust=0.5),
        plot.title = element_text(hjust = 0.5),
        strip.text = element_markdown())

输出:

使用了一些数据:

#Data
SeasonalMean <- structure(list(Pollutant = c("SO2", "NO", "NO2", "NOX", "CO", 
"O3", "PM", "NOX", "CO", "O3", "PM", "SO2", "NO", "NO2", "CO", 
"O3", "PM", "SO2", "NO", "NO2", "NOX", "O3", "PM", "SO2", "NO", 
"NO2", "NOX", "CO"), Season = c("Winter", "Winter", "Winter", 
"Winter", "Winter", "Winter", "Winter", "Spring", "Spring", "Spring", 
"Spring", "Spring", "Spring", "Spring", "Summer", "Summer", "Summer", 
"Summer", "Summer", "Summer", "Summer", "Fall", "Fall", "Fall", 
"Fall", "Fall", "Fall", "Fall"), mean = c(4.3594786, 4.808681, 
13.4610992, 18.2377363, 0.2578629, 25.097891, 9.4271302, 14.1144831, 
0.2198282, 26.2944466, 7.7559475, 2.7709979, 3.3221394, 10.7621779, 
0.2332291, 25.8531689, 8.5609107, 3.2485138, 4.3011274, 11.4917325, 
15.8515746, 25.3569794, 8.0808294, 3.7543985, 3.1074317, 11.8911633, 
15.0387167, 0.2378491), cv = c(1.2606103, 1.313842, 0.4983027, 
0.6503697, 0.3373904, 0.4094255, 0.5599974, 0.6320194, 0.2964914, 
0.3021818, 0.5107155, 1.5018185, 1.4227275, 0.4771676, 0.3337901, 
0.3426781, 0.5751629, 1.3612882, 1.6905351, 0.4739557, 0.7333461, 
0.3529466, 0.5460776, 1.3780758, 1.1202237, 0.4549728, 0.5627663, 
0.2780384)), class = "data.frame", row.names = c(NA, -28L))