Multi-row x-axis 在 R 中有中断的标签

Multi-row x-axis labels with breaks in R

我想在我的线图上添加 2 行 x-axis 标签,但不确定如何将我的第一个 x-axis 的连续标签和中断(列“CYR " - 日历年的缩写)。我想让第二个轴 (WYR) 在第一个标签和第二个标签之间开始 half-way(WYR = 2010 在 CYR = 2009 -> 2010 之间开始)。我也不确定如何添加 2 x-axis 标题,也许在每个 x-axis 行的开头?

我的数据:

> dput(wet_pivot)
structure(list(WYR = c("WR_2010", "WR_2011", "WR_2012", "WR_2013", 
"WR_2014", "WR_2015", "WR_2016", "WR_2017", "WR_2018", "WR_2019", 
"WR_2020", "WR_2021", "WR_2022"), CYR = c(2009, 2010, 2011, 2012, 
2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021), Season = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("DRY", 
"WET"), class = "factor"), N = c(59L, 63L, 69L, 70L, 72L, 71L, 
71L, 72L, 71L, 68L, 70L, 48L, 72L), n_mean = c(0.00696806934430411, 
0.000649730847004026, 0.00288256551918419, 0.01141088388474, 
0.000536174103147671, 0.00349584646220785, 0.000482925207291882, 
0.00245359625194744, 0.00292096956686587, 0.00252817293686805, 
0.00196286772014134, 0.00501799463867351, 0.00132244297252478
), n_median = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), sd = c(0.030946706350869, 
0.00248965525641742, 0.0100973832581282, 0.051577934580242, 0.00331468784320076, 
0.0266064084754242, 0.00212505905295283, 0.00675243933898364, 
0.0119729983336735, 0.00639785127193391, 0.00930625647382774, 
0.0136275258272549, 0.00543420856675111), se = c(0.00402891799826298, 
0.000313667078988821, 0.00121558209746373, 0.0061647423020683, 
0.000390639708573979, 0.00315759975690469, 0.000252198110662322, 
0.000795782607691024, 0.00142093348159893, 0.000775853428563995, 
0.00111231039833223, 0.00196696392618855, 0.000640427621321956
)), row.names = c(NA, -13L), class = "data.frame")

我的尝试:

years <- seq(2009,2021,1)
labs <- seq(2009,2021,by=1)

myplot <- ggplot(wet_pivot, aes(x = CYR, y = n_mean)) +
  geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se), width=.2, color = "black") +
  geom_point(color = "black", shape = 1, size = 2) +
geom_line(color = "black") +
  scale_y_continuous(limits = c(0, 0.04), expand = expansion(mult = c(0, 0.05))) +
  scale_x_continuous(breaks= years, labels = labs)

myplot +
annotate(geom = "text",
             x = 1:nrow(wet_pivot),
             y = min(wet_pivot$n_mean),
             label = labs,
             vjust = 3.5) +
annotate(geom = "text",
             x = 1:nrow(wet_pivot),
             y = min(wet_pivot$n_mean),
             label = wet_pivot$WYR,
             vjust = 5)

您确实可以使用文本注释来替代 x-axis 标签。几点建议:

  • 设置 y = -Inf 以自动将文本置于底部,与绘图上的任何数据无关。 vjust确实可以用来往下放。
  • 您需要 coord_cartesian(clip = "off") 才能实际显示文本。
  • 您可以放置​​ 'titles' 额外的注释层,x = -Inf 将其放置在左侧。

我在下面的示例中使用了上面的内容。也许文本仍然很大,所以您可以将 8.8 / .pt 设置为更小的值。 (/ .ptgeom_text() 使用的 mm 转换为主题中使用的点)

library(ggplot2)

# wet_pivot <- structure(...) # omitted for previty

ggplot(wet_pivot, aes(x = CYR, y = n_mean)) +
  geom_errorbar(aes(ymin=n_mean-se, ymax=n_mean+se), width=.2, color = "black") +
  geom_point(color = "black", shape = 1, size = 2) +
  geom_line(color = "black") +
  scale_y_continuous(limits = c(0, 0.04), expand = expansion(mult = c(0, 0.05))) +
  scale_x_continuous(breaks= years, labels = ~ rep("", length(.x))) +
  annotate(geom = "text",
           x = wet_pivot$CYR,
           y = -Inf,
           label = labs, 
           size = 8.8 / .pt,
           vjust = 2.5) +
  annotate(geom = "text",
           x = wet_pivot$CYR,
           y = -Inf,
           label = wet_pivot$WYR, 
           size = 8.8 / .pt,
           vjust = 4) +
  # Titles
  annotate(geom = "text",
           x = -Inf,
           y = -Inf,
           label = c("CYR", "WYR"),
           vjust = c(2.5, 4), hjust = 1,
           size = 8.8 / .pt
           ) +
  coord_cartesian(clip = "off") +
  theme(
    # Make extra space between axis ticks and axis title
    axis.text.x.bottom = element_text(margin = margin(t = 8.8, b = 8.8))
  )

reprex package (v2.0.1)

于 2022-05-19 创建