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

ggplot2散点重叠时自定义配色及添加韦恩图图例的实现方法问询

实现方案

核心思路是先统计每个坐标点位的分组重叠状态,再将状态映射到自定义颜色,最后用组合图工具拼接主散点图和韦恩图例即可,完整实现代码如下:

# 先安装依赖包(首次运行执行)
# install.packages(c("dplyr", "ggvenn", "patchwork"))

library(ggplot2)
library(dplyr)
library(ggvenn)
library(patchwork)

# 原始数据
vec1_num = c(1,2,3,4,1,3,4,5,5,5)
vec2_num = c(1,2,3,4,1,3,4,5,5,5)
vec3_char = c("A", "B", "C", "A", "B", "C", "C", "A", "B", "C")

# 1. 数据预处理:统计每个坐标点的重叠状态
df <- data.frame(
  x = vec1_num,
  y = vec2_num,
  group = vec3_char
)

df_stat <- df %>%
  group_by(x, y) %>%
  summarise(
    # 按字母顺序拼接当前点位的所有分组,避免出现BA、CB这类无序标签
    overlap_status = paste(sort(unique(group)), collapse = ""),
    .groups = "drop"
  ) %>%
  # 每个坐标仅保留1个点位,避免重复绘制
  distinct(x, y, .keep_all = TRUE)

# 2. 自定义颜色映射,和需求完全对应
color_map <- c(
  "A" = "darkblue",
  "B" = "darkred",
  "C" = "orange",
  "AB" = "black",
  "BC" = "pink",
  "ABC" = "gray"
)

# 3. 绘制主散点图,样式和原无扰动版本完全一致
main_plot <- ggplot(df_stat) +
  geom_point(aes(x = x, y = y, color = overlap_status), size = 4, alpha = 0.4) +
  scale_color_manual(values = color_map, guide = "none") + # 隐藏默认图例,用韦恩图替代
  theme(
    panel.grid = element_blank(),
    panel.background = element_rect(fill = "white", color = "black")
  ) +
  labs(x = "vec1_num", y = "vec2_num")

# 4. 绘制小型韦恩图例
venn_list <- list(A = 1, B = 2, C = 3)
venn_fill <- color_map[c("A", "B", "C", "AB", "BC", "ABC")]
names(venn_fill) <- c("A", "B", "C", "A∩B", "B∩C", "A∩B∩C")

venn_plot <- ggvenn(
  venn_list,
  fill_color = venn_fill,
  stroke_size = 0.5,
  set_name_size = 3,
  text_size = 0 # 隐藏韦恩图默认数值文本,只展示颜色对应关系
) +
  theme(panel.background = element_rect(fill = "transparent", color = NA))

# 5. 拼接主图和图例,调整宽度占比
combined_plot <- main_plot + venn_plot + plot_layout(widths = c(8, 2))
print(combined_plot)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:04