将图例对象按颜色排列在两行中 - ggplot

问题描述 投票:0回答:1

现在图例共有 4 行。我希望图例只有两行,顶行是指示记录器数据的圆圈(圆圈),底行是各种符号(即时数据)。不过,我希望顶部的图例项与下面的图例项颜色匹配(同一站点)。

legend needs alignment

数据

sep_sonde_do <- structure(list(station_name = c("TMDL-Est", "TMDL-R1", "TMDL-R2", 
"TMDL-R3", "TMDL-SA", "TMDL-CL", "TMDL-Est", "TMDL-R1", "TMDL-R2", 
"TMDL-R3", "TMDL-SA", "TMDL-CL", "TMDL-Est", "TMDL-R1", "TMDL-R2", 
"TMDL-R3", "TMDL-SA", "TMDL-CL", "TMDL-Est", "TMDL-R1", "TMDL-R2", 
"TMDL-R3", "TMDL-SA", "TMDL-CL", "TMDL-Est", "TMDL-R1", "TMDL-R2", 
"TMDL-R3", "TMDL-SA", "TMDL-CL"), sample_date_time = c("2023-09-15 11:00:00", 
"2023-09-15 11:00:00", "2023-09-15 11:00:00", "2023-09-15 11:00:00", 
"2023-09-15 11:00:00", "2023-09-15 11:00:00", "2023-09-15 11:15:00", 
"2023-09-15 11:15:00", "2023-09-15 11:15:00", "2023-09-15 11:15:00", 
"2023-09-15 11:15:00", "2023-09-15 11:15:00", "2023-09-15 11:30:00", 
"2023-09-15 11:30:00", "2023-09-15 11:30:00", "2023-09-15 11:30:00", 
"2023-09-15 11:30:00", "2023-09-15 11:30:00", "2023-09-15 11:45:00", 
"2023-09-15 11:45:00", "2023-09-15 11:45:00", "2023-09-15 11:45:00", 
"2023-09-15 11:45:00", "2023-09-15 11:45:00", "2023-09-15 12:00:00", 
"2023-09-15 12:00:00", "2023-09-15 12:00:00", "2023-09-15 12:00:00", 
"2023-09-15 12:00:00", "2023-09-15 12:00:00"), parameter = c("Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen"), result = c(17.28, 10.18, 8.71, 8.71, 8.95, 
8.61, 16.72, 10.03, 8.55, 8.55, 8.53, 8.41, 16.48, 9.84, 8.4, 
8.38, 8.17, 8.21, 16.92, 9.72, 8.25, 8.3, 7.85, 8.03, 16.74, 
9.57, 8.05, 8.21, 7.55, 7.85), units = c("mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L"), comments = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA), date = c("2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", "2023-09-15", 
"2023-09-15", "2023-09-15", "2023-09-15"), ym = c("2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09")), row.names = c(NA, 
30L), class = "data.frame")

sep_sonde_do_situ <- structure(list(station_name = c("Instant TMDL-R1", "Instant TMDL-R1", 
"Instant TMDL-R1", "Instant TMDL-R2", "Instant TMDL-R2", "Instant TMDL-R2", 
"Instant TMDL-R3", "Instant TMDL-R3", "Instant TMDL-R3", "Instant TMDL-R4", 
"Instant TMDL-R4", "Instant TMDL-R4", "Instant TMDL-R4", "Instant TMDL-SA", 
"Instant TMDL-SA", "Instant TMDL-SA", "Instant TMDL-CL", "Instant TMDL-CL", 
"Instant TMDL-CL"), sample_date_time = c("2023-09-15 05:51:00", 
"2023-09-22 03:29:00", "2023-09-29 05:09:00", "2023-09-15 05:13:00", 
"2023-09-22 03:07:00", "2023-09-29 04:43:00", "2023-09-15 04:35:00", 
"2023-09-22 02:42:00", "2023-09-29 04:09:00", "2023-09-15 03:45:00", 
"2023-09-29 03:35:00", "2023-10-06 04:21:00", "2023-10-13 03:40:00", 
"2023-09-15 03:15:00", "2023-09-22 02:08:00", "2023-09-29 03:22:00", 
"2023-09-15 02:45:00", "2023-09-22 01:30:00", "2023-09-29 02:49:00"
), parameter = c("Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", 
"Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen", "Dissolved Oxygen"
), result = c(9.45, 9.32, 8.86, 10.11, 10.46, 10.81, 8.86, 9.22, 
9.19, 7.02, 6.05, 7.96, 8.05, 9.28, 9.8, 9.48, 9.35, 10.1, 9.37
), units = c("mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", 
"mg/L", "mg/L", "mg/L", "mg/L", "mg/L"), date = c("2023-09-15", 
"2023-09-22", "2023-09-29", "2023-09-15", "2023-09-22", "2023-09-29", 
"2023-09-15", "2023-09-22", "2023-09-29", "2023-09-15", "2023-09-29", 
"2023-10-06", "2023-10-13", "2023-09-15", "2023-09-22", "2023-09-29", 
"2023-09-15", "2023-09-22", "2023-09-29"), ym = c("2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-10", "2023-10", 
"2023-09", "2023-09", "2023-09", "2023-09", "2023-09", "2023-09"
)), row.names = c(NA, -19L), class = "data.frame")


代码

sonde_axis_do <- sep_sonde_do %>% 
  select(date) %>% 
  arrange() %>% 
  unique()

annotation_do_sonde <- data.frame(
   x = c("2023-10-10"),
   y = c(7.5),
   label = c("Numeric Target Minimum DO = 7 mg/L")
)


ggplot() +
  geom_point(
    data = sep_sonde_do, aes(
      x = sample_date_time,
      y = result, color = station_name,
      group = station_name
    ),
    size = 0.8, alpha = 0.6
  ) +
  geom_point(data = sep_sonde_do_situ, aes(
    x = sample_date_time, y = result, fill = station_name,
    shape = station_name,
    group = station_name
  ), size = 3) +
  geom_point(
    data = sep_sonde_do_situ, aes(
      x = sample_date_time, y = result,
      shape = station_name,
      group = station_name
    ), size = 3,
    color = "black", alpha = 1
  ) +
  geom_hline(yintercept = c(7), linetype = "solid", color = "black", size = 0.7) +
  geom_text(
    data = annotation_do_sonde, aes(x = x, y = y, label = label),
    size = 1.2, size.unit = "mm"
  ) +
  scale_y_continuous(
    limits = c(0, 22), breaks = seq(0, 22, by = 2),
    expand = c(0, 0)
  ) +
  scale_x_discrete(
    breaks = unique(sep_sonde_do$date),
    labels = unique(sep_sonde_do$date),
    expand = c(0.04, 0.04)
  ) +
  scale_shape_manual(values = 20:26) +
  scale_color_viridis(
    labels = \(x) paste0(x, "<span style='color: transparent'> Instant</span>"),
    discrete = TRUE, name = NULL,
    guide = guide_legend(order = 2, override.aes = list(size = 3))
  ) +
  scale_fill_viridis_d() +
  labs(title = "September 2023 - Dissolved Oxygen", y = "Dissolved Oxygen (mg/L)") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title.x = element_blank(),
    legend.position = "bottom",
    legend.box = "vertical",
    legend.direction = "horizontal",

    legend.margin = margin(),

    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.title = element_blank(),
    legend.text = ggtext::element_markdown(size = 6.7),
    legend.key.width = unit(0.15, 'cm')
  )
r ggplot2
1个回答
0
投票

您可以使用单个guides()来完成此操作,而不是设置每个比例中的列数

guides(
    shape = guide_legend(ncol = 7, override.aes = list(size = 3)),
    color = guide_legend(ncol = 7, override.aes = list(size = 3)),
  ) +
© www.soinside.com 2019 - 2024. All rights reserved.