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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:12:46