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

如何在R的ggmap中基于百分比而非行数绘制热图并解决因子错误?

嘿,我来帮你搞定这个阿姆斯特丹热图的问题!先从你遇到的报错说起,再一步步实现你要的加权热图效果:

解决步骤

1. 先搞定报错:ggplot数据格式问题

你碰到的ggplot2 doesn't know how to deal with data of class factor错误,根源很简单:你给geom_density2d和stat_density2d传的data = dummy$sample_perc是单个列(因子/数值向量),但ggplot要求传入完整的数据框,而不是单独一列。

只需要把代码里的data = dummy$sample_perc改成data = dummy,同时确保你映射的经纬度列是数据框里的真实列名(比如你的longitude对应代码里的request_lng,latitude对应request_lat,要匹配上!)。

2. 实现基于sample_perc的加权热图

默认的stat_density2d是按数据点数量计算密度,但你需要的是基于sample_perc(样本占人口比例)做聚合加权。这时候我们可以用weight参数,把sample_perc作为密度计算的权重,这样热图就能体现比例的分布,而不是单纯的点数量分布。

修正后的完整代码

# 获取阿姆斯特丹地图
amsmap <- get_map(location="amsterdam", zoom=14)

# 绘制加权热图
ggmap(amsmap) + 
  # 可选:绘制密度轮廓线
  geom_density2d(data = dummy, 
                 aes(x = request_lng, y = request_lat, weight = sample_perc), 
                 size = 0.3) + 
  # 核心:绘制填充的密度多边形,用sample_perc做权重
  stat_density2d(data = dummy, 
                 aes(x = request_lng, y = request_lat, 
                     weight = sample_perc,
                     fill = ..level.., alpha = ..level..), 
                 size = 0.01, bins = 16, geom = "polygon") + 
  scale_fill_gradient(low = "green", high = "red") + 
  scale_alpha(range = c(0, 0.3), guide = FALSE) +
  labs(title = "阿姆斯特丹样本占人口比例热图", x = "经度", y = "纬度")

3. 处理“部分坐标无数据”的问题

地图上有些区域没有对应数据是正常的——热图只会在有数据点的区域生成密度分布。如果想让可视化效果更自然,你可以试试这些小技巧:

  • 先清理数据:用dummy_cleaned <- na.omit(dummy)去除含缺失经纬度或sample_perc的行
  • 调整bins参数:减小到8会让轮廓更粗糙,增大到20会更精细
  • 增加平滑度:给stat_density2d加个adjust = 1.5参数,让密度分布更柔和

关键注意事项

  • 确保经纬度列(request_lng/request_lat)和sample_perc都是数值型:如果是因子类型,先转换,比如dummy$sample_perc <- as.numeric(as.character(dummy$sample_perc))
  • 如果你数据里的经纬度列名不是request_lng/request_lat,一定要替换成你实际的列名(比如longitude/latitude)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:47