如何在patchwork布局中合并尺寸刻度不同的同名图例?
解决patchwork合并图形时的图例自定义需求
我尝试用patchwork将两个子图(Group 1和Group 2)整合到同一页面,每个子图均通过disp映射点颜色、hp映射点尺寸。但合并后图例未达到预期效果:希望disp图例覆盖全部数据的取值范围,同时hp图例保留两组数据各自的取值范围。
原始代码如下:
data(mtcars) mydata1<-mtcars %>% slice(1:16) mydata2<-mtcars %>% slice(17:32) library(ggplot2) library(patchwork) set.seed(42) ## for sake of reproducibility P1<-ggplot()+ geom_point(data = mydata1, mapping = aes(x = cyl, y = mpg, col = disp, size = hp))+ ggtitle('Group 1') P2<-ggplot()+ geom_point(data = mydata2, mapping = aes(x = cyl, y = mpg, col = disp, size = hp))+ ggtitle('Group 2') P3 <- P1 + P2 + plot_layout(guides='collect', ncol = 2) P3
解决方案
要实现需求,关键是让两个子图共享disp的颜色刻度范围,同时保留各自独立的hp尺寸刻度:
- 先计算整个数据集的
disp取值范围,作为统一的颜色刻度边界 - 给两个子图设置相同的颜色刻度,确保
disp图例能合并 - 利用patchwork的图例收集功能,自动保留不同的
hp图例
修改后的代码:
data(mtcars) mydata1<-mtcars %>% slice(1:16) mydata2<-mtcars %>% slice(17:32) library(ggplot2) library(patchwork) set.seed(42) # 计算全局disp的范围,用于统一颜色刻度 global_disp_range <- range(mtcars$disp) P1<-ggplot()+ geom_point(data = mydata1, mapping = aes(x = cyl, y = mpg, col = disp, size = hp))+ scale_color_continuous(limits = global_disp_range) + # 设置统一的颜色范围 ggtitle('Group 1') P2<-ggplot()+ geom_point(data = mydata2, mapping = aes(x = cyl, y = mpg, col = disp, size = hp))+ scale_color_continuous(limits = global_disp_range) + # 与P1保持一致 ggtitle('Group 2') P3 <- P1 + P2 + plot_layout(guides='collect', ncol = 2) + plot_annotation(title = "合并后的图形") # 可选:添加整体标题 P3
效果说明
disp的颜色刻度基于整个mtcars数据集的范围设置,两个子图使用完全相同的标尺,因此patchwork会将其合并为一个覆盖全局范围的图例hp的尺寸刻度在两个子图中保持各自的取值范围,patchwork收集图例时会保留两个独立的hp图例,分别对应Group 1和Group 2的数据
内容的提问来源于stack exchange,提问作者Gabby
相关产品推荐
相关产品推荐

