如何按id分组批量绘制x-y散点图,按变量z排序并上色?
解决方案
完全可以实现你的需求:为每个个体绘制独立的x-y散点图并在同一画布展示,同时按变量z排序面板,用颜色映射z的取值程度。以下是基于R语言ggplot2和dplyr的实现步骤:
1. 数据预处理
首先加载依赖包,然后对数据按z值排序,将id转换为按z排序的因子,确保后续面板按z的顺序排列:
# 加载所需包 library(ggplot2) library(dplyr) # 导入你的数据 dat1.1 <- structure(list(id = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), index = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), x = c(7.443917, 7.520429, 7.446833, 8.07893, 8.534033, 8.263931, 7.598647, 6.902987, 7.672617, 7.739256, 7.591341, 8.101125, 7.811751, 6.596834, 6.637652, 8.467165, 7.835399, 6.500149, 7.083198, 7.531798, 6.110208, 6.368534, 5.26318, 6.735778, 5.580152, 5.460161, 5.844303, 6.258181, 7.191627, 5.105033, 6.760193, 5.857215, 5.866264, 6.769086, 6.547294, 5.623804, 4.675815, 6.153901, 6.040519, 6.236045, 8.216397, 6.097841, 5.491311, 5.831432, 6.297337, 6.655688, 5.553445, 6.37449, 6.271961, 6.959645, 7.080341, 6.46092, 6.476955, 7.221111, 6.219023, NA, NA, NA, NA, NA, 8.21752, 7.589581, 8.363739, 8.849697, 7.78645, 7.494006, 7.827766, 9.11352, 7.80884, 6.701855, 6.259061, 5.523358, 6.186617, 6.548538, 6.6937, 7.213297, 5.243428, 7.510827, 7.054297, 7.603241), y = c(106L, 114L, 50L, 50L, 56L, 46L, 50L, 52L, 114L, 50L, 56L, 26L, 48L, 52L, 48L, 54L, 54L, 56L, 52L, 50L, 84L, 86L, 88L, 86L, 82L, 84L, 88L, 84L, 86L, 84L, 86L, 86L, 84L, 84L, 88L, 88L, 88L, 84L, 86L, 120L, 106L, 168L, 116L, 56L, 108L, 68L, 68L, 70L, 74L, 76L, 76L, 76L, 72L, 70L, 118L, NA, NA, NA, NA, NA, 60L, 62L, 52L, 90L, 50L, 50L, 54L, 56L, 52L, 30L, 78L, 30L, 52L, 54L, 52L, 80L, 86L, 46L, 54L, 84L), z = c(33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 54L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L)), class = "data.frame", row.names = c(NA, -80L)) # 按z值对id排序,转换为因子以固定面板顺序 dat_sorted <- dat1.1 %>% group_by(id) %>% mutate(z_group = first(z)) %>% # 每个id的z值一致,取第一个即可 ungroup() %>% arrange(z_group) %>% mutate(id = factor(id, levels = unique(id)))
2. 绘制图形
使用分面功能实现个体独立散点图,同时用颜色映射z值:
ggplot(dat_sorted, aes(x = x, y = y, color = z)) + geom_point(size = 2, na.rm = TRUE) + # 忽略NA值,避免绘图报错 facet_wrap(~id, ncol = 2) + # 按id分面,设置2列排列 scale_color_viridis_c(option = "magma") + # 用连续渐变色展示z的取值程度 labs(title = "各个体x-y散点图(按z值排序)", x = "变量x", y = "变量y", color = "变量z") + theme_bw() + theme( strip.background = element_rect(fill = "#f5f5f5"), plot.title = element_text(hjust = 0.5, size = 14) )
关键说明
- 由于每个
id对应的z值完全一致,我们通过提取每个id的z值进行排序,确保面板按z的大小顺序排列。 scale_color_viridis_c提供了友好的色盲友好型渐变色,也可以用scale_color_gradient(low = "blue", high = "red")自定义颜色映射。facet_wrap的ncol参数可以根据个体数量调整面板列数,优化展示布局。
内容的提问来源于stack exchange,提问作者cory
相关产品推荐
相关产品推荐

