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

R语言中如何快速计算并可视化两组geom_bin2d分箱计数差值?

两组二维分箱计数差值的可视化方案

核心思路是提前对数据统一分箱并统计计数,再计算两组差值,避免依赖ggplot内部分箱导致的无法直接对比问题,具体实现有两种主流方式:

方法一:Tidyverse工作流(推荐)

利用dplyr和tidyr完成分箱、统计、差值计算,全程基于数据框操作,贴合ggplot使用习惯:

# 加载必要包
library(tidyverse)

# 统一分箱+统计+计算差值
df_processed <- diamonds %>%
  # 筛选目标分组
  filter(color %in% c("H", "E")) %>%
  # 对carat和price按40个分箱划分(与geom_bin2d的bins参数对应)
  mutate(
    carat_bin = cut_interval(carat, n = 40),
    price_bin = cut_interval(price, n = 40)
  ) %>%
  # 按分箱和颜色分组统计计数
  count(color, carat_bin, price_bin) %>%
  # 转宽格式,方便计算差值,空分箱补0
  pivot_wider(names_from = color, values_from = n, values_fill = 0) %>%
  # 计算H组减E组的计数差值(可根据需求调整为E-H)
  mutate(count_diff = H - E) %>%
  # 将分箱区间转为中点值,优化绘图坐标展示
  mutate(
    carat_mid = map_dbl(carat_bin, ~mean(as.numeric(.x))),
    price_mid = map_dbl(price_bin, ~mean(as.numeric(.x)))
  )

# 可视化差值
ggplot(df_processed, aes(x = carat_mid, y = price_mid, fill = count_diff)) +
  geom_tile() +
  # 设置渐变颜色,正负差值用不同颜色区分
  scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) +
  labs(x = "Carat", y = "Price", fill = "H - E 计数差值") +
  theme_minimal()

关键注意事项:

  • 必须在原始数据上统一分箱,再分组统计,确保两组分箱边界完全一致,避免差值计算错位。
  • cut_interval()用于等距分箱,和geom_bin2d默认逻辑一致;如果需要等数量分箱,替换为cut_number()即可。
  • values_fill = 0处理某组无数据的分箱,防止NA干扰差值计算。

方法二:MASS包hist2d直接分箱

利用MASS::hist2d直接获取二维分箱结果,再手动计算差值:

library(MASS)
library(ggplot2)

# 提取目标分组数据
df_color_H <- filter(diamonds, color == "H")
df_color_E <- filter(diamonds, color == "E")

# 分别生成二维直方图(不直接绘图)
h_hist <- hist2d(df_color_H$carat, df_color_H$price, nbins = 40, plot = FALSE)
e_hist <- hist2d(df_color_E$carat, df_color_E$price, nbins = 40, plot = FALSE)

# 计算两组计数差值
diff_counts <- h_hist$counts - e_hist$counts

# 转换为ggplot可用的数据框
diff_df <- expand.grid(
  carat_mid = h_hist$xbreaks[-1] - diff(h_hist$xbreaks)/2,
  price_mid = h_hist$ybreaks[-1] - diff(h_hist$ybreaks)/2
) %>%
  mutate(count_diff = as.vector(diff_counts))

# 可视化
ggplot(diff_df, aes(x = carat_mid, y = price_mid, fill = count_diff)) +
  geom_tile() +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) +
  labs(x = "Carat", y = "Price", fill = "H - E 计数差值")

适用场景:

如果已经习惯使用hist2d做二维直方图,这种方法可以快速复用分箱逻辑,无需额外的数据框转换操作。

内容的提问来源于stack exchange,提问作者KyleS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:04