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

如何在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尺寸刻度:

  1. 先计算整个数据集的disp取值范围,作为统一的颜色刻度边界
  2. 给两个子图设置相同的颜色刻度,确保disp图例能合并
  3. 利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:16:13