如何用ggplot2+patchwork实现共享Y轴与图例的并排绘图?
用ggplot2和patchwork实现DEM图共享Y轴与图例
要实现共享Y轴和合并图例,只需对现有代码做以下几处修改:
完整修改后代码
library(ggplot2) library(patchwork) # 转成带坐标的数据框(原逻辑不变) df_dem10 <- dem %>% as.data.frame(xy = TRUE) df_dem30 <- dem30 %>% as.data.frame(xy = TRUE) # 定义统一的填充色刻度,避免重复创建 common_fill <- scale_fill_gradientn(colors = terrain.colors(100), name = "高程") # 左图:保留完整Y轴 p1 <- ggplot(df_dem10) + geom_raster(aes(x = x, y = y, fill = `10m_BA`)) + common_fill + labs(x = "X坐标", y = "Y坐标") + theme_bw() # 右图:隐藏Y轴的标题、刻度和标签 p2 <- ggplot(df_dem30) + geom_raster(aes(x = x, y = y, fill = `10m_BA`)) + common_fill + labs(x = "X坐标") + theme_bw() + theme( axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank() ) # 组合图形:合并图例+并排布局 combined_plot <- p1 + p2 + plot_layout(ncol = 2, guides = "collect") + plot_annotation(title = "10m与30m分辨率DEM对比") # 展示图形 print(combined_plot)
核心修改说明
- 统一图例配置:单独定义
common_fill并在两个图中复用,配合plot_layout(guides = "collect")就能自动合并图例,避免重复生成。 - 隐藏右侧Y轴元素:通过
theme()把右图的Y轴标题、刻度文本、刻度线都设为element_blank(),只保留左侧Y轴作为共享轴。 - 自动对齐Y轴范围:如果两个DEM数据的Y坐标范围一致,patchwork会自动对齐轴范围;如果范围不同,可在两个图里加
ylim(min_y, max_y)手动指定统一范围。 - 统一主题风格:添加
theme_bw()让两个图视觉风格统一,对比更直观。
原效果参考:
内容的提问来源于stack exchange,提问作者arkriger
相关产品推荐
相关产品推荐

