You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2图例项重叠问题:如何分离线条与符号图例

分离ggplot2中的线条颜色图例与符号形状图例

核心思路

将符号的类型映射到shape美学,与线条的colour美学分离,生成两个独立图例避免重叠。同时整理数据减少重复的geom_point调用,提升代码可维护性。

步骤1:整理测试数据

把原数据中四个标记列转换为长格式,统一管理标记类型:

library(tidyverse)
library(ggh4x)

# 转换为长格式,筛选出需要标记的行
test_long <- test %>%
  pivot_longer(cols = c(minDate, maxDate, maxDate2, noMaxDate2),
               names_to = "marker_type", values_to = "is_marker") %>%
  filter(is_marker == 1) %>%
  # 给标记类型设置可读性标签
  mutate(marker_type = factor(marker_type, 
                              levels = c("minDate", "maxDate", "maxDate2", "noMaxDate2"),
                              labels = c("最小值日期", "最大值日期", "第二最大值日期", "无第二最大值")))

步骤2:绘制分离图例的图表

通过colour映射位置ID(label2),shape映射标记类型,分别设置两个图例的样式:

cols <- c("#ADD8E6","#B4EDD2","#E86A92","#F6AE2D")
# 定义对应标记类型的符号形状
marker_shapes <- c(17, 16, 18, 15) # 三角形、圆形、菱形、方形

p1 <- ggplot(test, aes(x = DateTime, y = mAODscale, colour = label2)) +
  geom_line(linewidth = 1) +
  # 统一调用geom_point,映射shape到标记类型
  geom_point(data = test_long, 
             aes(shape = marker_type), 
             size = 2.5) +
  # 设置位置ID的颜色图例
  scale_colour_manual(name = "位置ID", values = cols) +
  # 设置标记类型的形状图例
  scale_shape_manual(name = "标记类型", values = marker_shapes) +
  # 调整图例布局,垂直排列在底部
  theme(legend.position = "bottom",
        legend.box = "vertical",
        legend.spacing.y = unit(0.5, "cm")) +
  facet_wrap2(~fourLoc, ncol = 2)

print(p1)

效果说明

运行代码后会生成两个独立的图例:

  • 对应label2的颜色线条图例,展示不同位置ID的线条颜色
  • 对应marker_type的符号形状图例,展示四种标记的含义
    两个图例完全分离,不会出现重叠问题。

内容的提问来源于stack exchange,提问作者Melanie Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:33:22