如何在R的ggplot2中将气泡图强制对齐至均匀网格?
解决ggplot2气泡图重叠并对齐网格的方案
要解决气泡重叠问题,同时保留背景的二维密度图,核心思路是先对原始数据做网格分箱聚合:把SST和HCI划分成均匀网格,计算每个网格内的渔获量总和,再用聚合后的结果绘制气泡——这样气泡只会出现在网格节点上,既对齐了网格,又不会破坏背景的密度分布。
完整实现代码
library(ggplot2) library(dplyr) library(cmocean) # 1. 对原始数据做网格分箱聚合 binned_data <- path_data %>% # 将SST和HCI划分成均匀区间,这里各分20箱,可根据需求调整n值 mutate( SST_bin = cut_interval(SST, n = 20), # 计算每个SST分箱的中点作为气泡x坐标 SST_center = (as.numeric(SST_bin) - 0.5) * (diff(range(SST))/20) + min(SST), HCI_bin = cut_interval(HCI, n = 20), # 计算每个HCI分箱的中点作为气泡y坐标 HCI_center = (as.numeric(HCI_bin) - 0.5) * (diff(range(HCI))/20) + min(HCI) ) %>% # 按网格分组,求和每个网格的渔获量 group_by(SST_center, HCI_center) %>% summarize(SUM_RETAINED_NUM = sum(SUM_RETAINED_NUM, na.rm = TRUE), .groups = "drop") # 2. 绘制背景二维密度图(用原始数据,保证密度分布准确) background_plot <- ggplot(path_data, aes(x = SST, y = HCI)) + stat_density_2d(aes(fill = ..density..), geom = "raster", contour = FALSE) + scale_fill_continuous(type = "viridis") + theme_gray() + ylim(-0.1, 1) # 3. 叠加网格对齐的气泡图(用聚合后的分箱数据) bubble_chart <- background_plot + geom_point(data = binned_data, aes(x = SST_center, y = HCI_center, size = SUM_RETAINED_NUM, color = SUM_RETAINED_NUM), alpha = 0.6) + scale_size_continuous(range = c(1, 10), guide = "legend") + scale_color_cmocean(name = "ice", direction = 1, guide = "legend") + theme_gray() # 展示最终图 bubble_chart
关键细节说明
- 调整分箱数量:修改
cut_interval中的n参数可以控制网格密度,n越大网格越密,气泡数量越多;反之则网格越疏,气泡越少。 - 等数量分箱:如果希望每个网格包含的原始数据点数量相近,可将
cut_interval替换为cut_number。 - 为什么不用
geom_bin2d:geom_bin2d是直接在图层上绘制分箱矩形,和气泡图的叠加逻辑冲突,而先聚合数据再绘制点的方式更灵活,能完美保留背景密度图的完整性。
内容的提问来源于stack exchange,提问作者blitz1259
相关产品推荐
相关产品推荐

