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
相关产品推荐
相关产品推荐

