如何使用 ggplot、facet_grid 和 geom_text 在列中添加变量作为文本

How to add variables in a column as text using ggplot, facet_grid and geom_text

考虑以下小标题

library(tidyverse)
df <-tibble(year = rep(1981:2020,4),
       x = rep(letters[1:8],20),
       y = rnorm(n = 160,0,1),
       group = rep(letters[10:13],40))

我想根据变量 group 绘制多面网格,作为每个面板中的文本,年份 (year) 对应于每个组 (group)。

低于年份重叠且不正确的失败尝试

ggplot() +
  geom_line(data = df, aes(x = x, y = y, color = group)) +
  geom_text(
    data = df,
    aes(
      x = x,
      y = 3,
      label = year,
      color = group
    ),
    alpha = 0.7,
    show.legend = FALSE
  ) +
  facet_grid( ~ group)

感谢支持!

我不确定我明白你想要什么,但你可以试试下面的方法

ggplot() +
  geom_line(data = df, aes(x = x, y = y, color = group)) +
  geom_text(
    data = df,
    aes(
      x = x,
      y = 3,
      label = year,
      color = group
    ),
    alpha = 0.7,
    show.legend = FALSE,
    position = position_stack(vjust = 1.5), 
#    stat = "unique"
  ) +
  facet_grid( ~ group)

如果您不想重复 year,请取消注释 stat = "unique" 行。

更新
如果你想要水平对齐,你可以创建一个新的数据框

df2 <- df %>% 
  group_by(x, group) %>% 
  summarise(year = str_c(unique(year), collapse=", "))

ggplot() +
  geom_line(data = df, aes(x = x, y = y, color = group)) +
  geom_text(
    data = df2,
    aes(
      x = x,
      y = 1,
      label = year,
      color = group
    ),
    alpha = 0.7,
    show.legend = FALSE,
    position = position_stack(vjust = 1.5), 
    stat = "unique"
  ) +
  facet_grid( ~ group)

但与此对齐标签会重叠。您可以尝试减少 font-size 或使用 facet_wrap 将面板排列成两行。

您还可以在 df2 中操作字符串并在需要的地方添加 "\n",但我认为这不能轻易适应每个字符串。