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

如何用R的ggplot绘制特定宠物占比的二维热力图?

分箱内特定宠物占比热力图实现步骤(以猫为例)

数据预处理步骤

  1. 先加载所需工具包:
library(dplyr)
library(ggplot2)
  1. 对X、Y坐标做分箱处理,这里用cut_interval()设置30个分箱(和geom_bin_2d默认分箱数一致,如果你之前改过分箱数,记得同步调整n的值):
df <- df %>%
  mutate(
    X_bin = cut_interval(X, n = 30),
    Y_bin = cut_interval(Y, n = 30)
  )
  1. 分组计算每个分箱的核心指标:
df_summary <- df %>%
  group_by(X_bin, Y_bin) %>%
  summarise(
    total_pets = n(), # 分箱内总宠物数
    cat_count = sum(Pet_type == "猫", na.rm = TRUE), # 分箱内猫的数量,na.rm处理缺失值
    cat_ratio = cat_count / total_pets, # 猫占该分箱总宠物的比例
    .groups = "drop" # 计算完成后取消分组
  )

绘图调整方法

用geom_tile()替代原来的geom_bin_2d,基于预处理好的统计数据绘图:

ggplot(df_summary, aes(x = X_bin, y = Y_bin, fill = cat_ratio)) +
  geom_tile(color = "white") + # 加白色边框,更清晰区分分箱
  scale_fill_viridis_c(labels = scales::percent_format()) + # 将比例转为百分比显示
  labs(
    x = "X坐标",
    y = "Y坐标",
    fill = "猫占总宠物比例",
    title = "各分箱内猫占总宠物的比例热力图"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签,避免重叠

补充:无需预处理的简化写法(适合进阶)

如果不想提前整理数据,也可以直接在ggplot中嵌套统计逻辑,用stat_summary_2d计算分箱内的比例:

ggplot(df, aes(x = X, y = Y)) +
  stat_summary_2d(
    aes(z = as.integer(Pet_type == "猫")),
    fun = function(x) mean(x, na.rm = TRUE) # 直接计算分箱内猫的占比
  ) +
  scale_fill_viridis_c(labels = scales::percent_format()) +
  labs(
    x = "X坐标",
    y = "Y坐标",
    fill = "猫占总宠物比例",
    title = "各分箱内猫占总宠物的比例热力图"
  )

这里as.integer(Pet_type == "猫")会把猫转成1,其他宠物转成0,mean()计算的就是分箱内猫的占比,逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:05:18