将自定义轴标签添加到 facet ggplot

Adding customized axis label to faceted ggplot

我正在尝试在多面 ggplot 的 x 轴文本的左侧添加一个文本元素,其中包含有关 x 轴的更多信息(一次)(不是每个面都重复):

直到现在我尝试了几种方法都失败了:

我的代码:

#1.1 create labels for x-axis:
cfutypes_labels <- c("native\n-\n-", "native\n-\n+",
                     "aliquot\n-\n-", "aliquot\n-\n+",
                     "aliquot\n+\n-", "aliquot\n+\n+")

names(cfutypes_labels) <- c("no.0.native", "yes.0.native", 
                            "no.0.aliquot","yes.0.aliquot", 
                            "no.20.aliquot", "yes.20.aliquot")

extra_axis <- c("storagetype\nglycerol\nfreeze-thaw-cycle")

#1.2 plotting

plot_t1calc1 <- thawcycles_long %>%
  filter(dilution_potency<5,
         count >0, cfutype =="cfuperml") %>%
  ggplot(aes(x=interaction(thawcycle,
                           glycerol_content,
                           storagetype), 
             y=count,
             color=interaction(thawcycle,
                               glycerol_content,
                               storagetype))) +
  geom_jitter(width=0.2,
              alpha=0.8,
              show.legend = FALSE)+
  stat_summary(geom = "crossbar",
               fun = "geometric.mean",
               width = 0.3,
               show.legend = FALSE)+
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^(x+1)),
                labels = trans_format("log10", math_format(10^.x))) +
  scale_x_discrete(labels = cfutypes_labels)+
  ylab("CFU per mL") + 
  xlab("")+
  facet_grid(~timepoint,
             scales="free_x",
             space="free")+
  theme_minimal()+
  theme(panel.background = element_rect(fill = "white"),
      #  axis.title.x = element_text(hjust = -0.5, 
       #                             vjust= 0.9,
        #                            size=9),
        axis.line = element_line(color="black",
                                 size=0.2),
        strip.text = element_text(face="bold"))

我的数据集的一小部分:

> tibble(thawcycles_long)
# A tibble: 567 x 9
     sid timepoint storagetype thawcycle glycerol_content dilution_potency cfutype       dotnumber    count
   <dbl> <chr>     <chr>       <chr>                <dbl>            <dbl> <chr>         <chr>        <dbl>
 1     4 t0        native      no                       0                3 dill1_cfu     1              104
 2     4 t0        native      no                       0                3 dill1_cfu     2               83
 3     4 t0        native      no                       0                3 dill1_cfu     3              106
 4     4 t0        native      no                       0                3 cfuperml      1         10400000
 5     4 t0        native      no                       0                3 cfuperml      2          8300000
 6     4 t0        native      no                       0                3 cfuperml      3         10600000
 7     4 t0        native      no                       0                3 auxv_cfuperml 1         10400000
 8     4 t0        native      no                       0                3 auxv_cfuperml 2          8300000
 9     4 t0        native      no                       0                3 auxv_cfuperml 3         10600000
10     4 t0        native      no                       0                4 dill1_cfu     1                7

有人知道如何解决这个问题吗? 非常感谢!

一种选择是像这样使用 geom_text

重要的是添加 coord_cartesian(clip = "off", ylim = c(1, NA)) 以固定 y 比例并防止标签被剪掉。

此外,你必须为我通过增加绘图边距所做的标签制作一些 space。

extra_axis <- c("storagetype\nglycerol\nfreeze-thaw-cycle")

library(ggplot2)

ggplot(thawcycles_long, aes(x = var, y = count, color = var)) +
  geom_jitter(width = 0.2, alpha = 0.8, show.legend = FALSE) +
  scale_x_discrete(labels = cfutypes_labels) +
  scale_y_log10(breaks = scales::trans_breaks("log10", function(x) 10^(x+1)),
                labels = scales::trans_format("log10", scales::math_format(10^.x))) +
  labs(y = "CFU per mL", x = NULL) +
  facet_grid(~timepoint, scales = "free_x",  space = "free") +
  theme_minimal() +
  theme(
    panel.background = element_rect(fill = "white"),
    axis.line = element_line(color = "black",size = 0.2),
    strip.text = element_text(face = "bold"),
    plot.margin = margin(5.5, 5.5, 16.5, 55, unit = "pt")
  ) +
  geom_text(data = data.frame(timepoint = "t0"), aes(label = extra_axis), x = -1, y = -.1, 
            inherit.aes = FALSE, color = "red", hjust = .5, vjust = 1, size = 8 / .pt) +
  coord_cartesian(clip = "off", ylim = c(1, NA))

数据

set.seed(42)

thawcycles_long <- data.frame(
  thawcycle = sample(c("yes", "no"), 20, replace = TRUE),
  glycerol_content = sample(c(0, 20), 20, replace = TRUE),
  storagetype = sample(c("native", "aliquot"), 20, replace = TRUE),
  count = 1:20,
  timepoint = sample(c("t0", "t1"), 20, replace = TRUE)
)
thawcycles_long$var <- interaction(
  thawcycles_long$thawcycle,
  thawcycles_long$glycerol_content,
  thawcycles_long$storagetype
)