如何在R中让geom_pointdensity散点密度图并排并共享同范围图例?
在R中实现geom_pointdensity()子图并排并共享图例
当然可以实现,下面分两种常见场景给出具体解决方案:
场景1:同一数据集按分组变量生成子图(用facet)
如果你的数据是同一数据集、需要按某个分组变量拆分展示,直接用facet_wrap或facet_grid即可,天然支持共享图例,只需手动统一密度刻度范围确保一致性。
示例代码:
library(ggplot2) library(ggpointdensity) library(dplyr) # 构造示例数据 set.seed(123) df <- bind_rows( data.frame(x = rnorm(1000), y = rnorm(1000), group = "组1"), data.frame(x = rnorm(1000, mean = 2), y = rnorm(1000, mean = 2), group = "组2") ) # 绘制并排子图并共享图例 ggplot(df, aes(x = x, y = y)) + geom_pointdensity() + facet_wrap(~group, nrow = 1) + # 横向并排 scale_color_viridis_c( limits = c(0, max(df$..density..)), # 统一密度范围 name = "点密度" )
场景2:不同数据集生成独立子图(用patchwork拼接)
如果是完全独立的多个数据集,需要分别绘图后用patchwork包拼接,核心是提前统一所有子图的密度刻度范围,再合并图例。
示例代码:
library(ggplot2) library(ggpointdensity) library(patchwork) # 构造两个独立数据集 set.seed(456) df1 <- data.frame(x = rnorm(1500), y = rnorm(1500)) df2 <- data.frame(x = rnorm(1000, mean = 1.5), y = rnorm(1000, mean = -1)) # 提前计算所有数据集的密度极值,确定统一范围 get_density_range <- function(data) { p <- ggplot(data, aes(x, y)) + geom_pointdensity() dens_data <- layer_data(p) c(min(dens_data$density), max(dens_data$density)) } dens_ranges <- c(get_density_range(df1), get_density_range(df2)) min_dens <- min(dens_ranges) max_dens <- max(dens_ranges) # 分别绘制子图,统一刻度范围 p1 <- ggplot(df1, aes(x = x, y = y)) + geom_pointdensity() + scale_color_viridis_c(limits = c(min_dens, max_dens), name = "点密度") + theme(legend.position = "none") # 隐藏子图图例 p2 <- ggplot(df2, aes(x = x, y = y)) + geom_pointdensity() + scale_color_viridis_c(limits = c(min_dens, max_dens), name = "点密度") # 拼接子图并共享图例 p1 + p2 + plot_layout(guides = "collect") + # 合并共享图例 plot_annotation(title = "共享密度刻度的散点密度图")
关键注意点
- 两种方法的核心都是统一颜色刻度的
limits参数,确保所有子图的密度映射范围一致,避免颜色对比失真。 patchwork支持灵活调整子图比例、添加共同标题/注释,适合复杂的子图组合需求。
内容的提问来源于stack exchange,提问作者quick2063
相关产品推荐
相关产品推荐

