如何用R的ggplot绘制特定宠物占比的二维热力图?
分箱内特定宠物占比热力图实现步骤(以猫为例)
数据预处理步骤
- 先加载所需工具包:
library(dplyr) library(ggplot2)
- 对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) )
- 分组计算每个分箱的核心指标:
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
相关产品推荐
相关产品推荐

