如何在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
相关产品推荐
相关产品推荐

