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

