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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:27:03