如何用R将多数据集合并到同一张散点图中?
问题解答
完全可以用散点图实现三个数据集的合并展示,不需要更换图表类型,只需要通过区分数据来源的视觉特征(比如点的形状、额外分组标识),就能在同一张图里清晰呈现三个数据集的差异。
数据概览
data 1
| GO term | Count | Enrichment | P value |
|---|---|---|---|
| BP | 163 | 0.008 | 0.37 |
| MF | 48 | 0.007 | 0.33 |
| CC | 58 | 0.008 | 0.39 |
| KEGG | 27 | 0.008 | 0.43 |
data 2
| GO term | Count | Enrichment | P value |
|---|---|---|---|
| BP | 167 | 0.01 | 0.31 |
| MF | 50 | 0.008 | 0.29 |
| CC | 50 | 0.006 | 0.34 |
| KEGG | 23 | 0.01 | 0.37 |
data 3
| GO term | Count | Enrichment | P value |
|---|---|---|---|
| BP | 123 | 0.009 | 0.22 |
| MF | 44 | 0.01 | 0.22 |
| CC | 50 | 0.007 | 0.24 |
| KEGG | 14 | 0.009 | 0.28 |
可复现代码(数据部分)
# 生成三个数据集 data_1 <- structure(list(GO.term = c("BP", "MF", "CC", "KEGG"), Count = c(163L, 48L, 58L, 27L), Enrichment = c(0.008, 0.007, 0.008, 0.008), P.value = c(0.37, 0.33, 0.39, 0.43)), class = "data.frame", row.names = c(NA, 4L)) data_2 <- structure(list(GO.term = c("BP", "MF", "CC", "KEGG"), Count = c(167L, 50L, 50L, 23L), Enrichment = c(0.01, 0.008, 0.006, 0.01), P.value = c(0.31, 0.29, 0.34, 0.37)), class = "data.frame", row.names = c(NA, 4L)) data_3 <- structure(list(GO.term = c("BP", "MF", "CC", "KEGG"), Count = c(123L, 44L, 50L, 14L), Enrichment = c(0.009, 0.01, 0.007, 0.009), P.value = c(0.22, 0.22, 0.24, 0.28)), class = "data.frame", row.names = c(NA, 4L))
合并数据集并绘制散点图的实现代码
先给每个数据集添加分组标识,合并成一个数据框后,用点的形状区分不同数据集,同时保留原有的Count(点大小)和P.value(点颜色)映射:
library(ggplot2) library(dplyr) # 添加分组标识并合并数据 combined_data <- bind_rows( data_1 %>% mutate(Group = "data_1"), data_2 %>% mutate(Group = "data_2"), data_3 %>% mutate(Group = "data_3") ) # 绘制合并后的散点图 ggplot(combined_data, aes(x = Enrichment, y = GO.term)) + geom_point(aes(size = Count, color = P.value, shape = Group), alpha = 0.8) + # 优化视觉效果 scale_color_viridis_c(option = "plasma", name = "P value") + scale_size_continuous(name = "Gene Count") + scale_shape_manual(values = c(16, 17, 18), name = "Dataset") + labs(x = "Enrichment", y = "GO/KEGG Term", title = "Enrichment Analysis across 3 Datasets") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5))
补充优化方案
如果担心同位置点重叠影响观察,可以:
- 给点添加轻微位置偏移:
geom_point(..., position = position_jitter(width = 0.0005)) - 降低点的透明度(已在代码中设置
alpha=0.8) - 若不需要严格在同一张图展示,也可以用分面图:
+ facet_wrap(~Group)
内容的提问来源于stack exchange,提问作者Bhagyashree Swarge
相关产品推荐
相关产品推荐

