如何使用geopandas基于多边形数据绘制KDE热图?
实现方案
你可以通过将多边形转换为质心点、基于x字段加权计算KDE、再叠加到底图的方式实现需求,完整操作步骤和代码如下:
前置依赖
需要提前安装好geopandas、scipy、numpy、matplotlib库。
操作代码
import geopandas as gpd import numpy as np from scipy.stats import gaussian_kde import matplotlib.pyplot as plt # 你的原始geodataframe变量为t # 1. 提取每个多边形的质心坐标与对应权重 t['centroid_x'] = t.centroid.x t['centroid_y'] = t.centroid.y # 可按需过滤x为0的样本,不需要的话直接取全部数据即可 valid_data = t[t['x'] > 0][['centroid_x', 'centroid_y', 'x']].values # 2. 计算加权KDE coords = valid_data[:, :2].T weights = valid_data[:, 2] # 可通过bw_method参数调整KDE平滑度,数值越大越平滑 kde = gaussian_kde(coords, weights=weights, bw_method=0.2) # 3. 生成研究区网格 xmin, ymin, xmax, ymax = t.total_bounds # 100j代表网格分辨率,数值越大热图越精细,计算速度越慢 xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] grid_points = np.vstack([xx.ravel(), yy.ravel()]) # 计算每个网格点的KDE值 kde_values = kde(grid_points).reshape(xx.shape) # 4. 绘制热图 fig, ax = plt.subplots(figsize=(10, 10)) # 先绘制多边形底边界(不需要的话可以删除此行) t.boundary.plot(ax=ax, color='lightgray', linewidth=0.3) # 绘制KDE热图,alpha调整透明度 im = ax.imshow( kde_values.T, extent=[xmin, xmax, ymin, ymax], origin='lower', cmap='coolwarm', alpha=0.7 ) # 可选添加色条 plt.colorbar(im, ax=ax, shrink=0.8) plt.axis('off') plt.show()
注意事项
- 若你的数据使用WGS84等地理坐标系(单位为度),KDE默认的带宽单位也为度,效果可能不符合预期,建议先通过
t.to_crs()转换为对应区域的投影坐标系(单位为米)后再计算。 - 带宽参数
bw_method可根据你的可视化需求调整,取值越大热图整体越平滑,取值越小则越突出局部高值区域。 - 若不需要保留多边形边界,直接删除绘制边界的代码行即可。
内容的提问来源于stack exchange,提问作者Arturo Sbr
相关产品推荐
相关产品推荐

