play_john 发表于 前天 21:07

Python运行成热力图,谢谢大佬

import geopandas as gpd
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity

# 数据加载
df = gpd.read_file('medical_data.geojson')# 您的医疗空间数据

# 核密度估计
kde = KernelDensity(bandwidth=0.15, kernel='epanechnikov')# 带宽经Silverman检验
coords = np.vstack().T
kde.fit(coords)

# 生成网格
xmin, ymin, xmax, ymax = df.total_bounds
xx, yy = np.mgrid# 500x500网格
grid_points = np.vstack().T
z = np.exp(kde.score_samples(grid_points))
z = z.reshape(xx.shape)

# 可视化
fig, ax = plt.subplots(figsize=(15, 10))
basemap = gpd.read_file('tibet_boundary.shp')# 西藏底图
basemap.plot(ax=ax, color='#f0f0f0', edgecolor='#999999')

# 热力图层
cf = ax.contourf(xx, yy, z,
                levels=20,
                cmap='RdYlGn_r',# 红-黄-绿色阶
                alpha=0.7,
                vmin=0, vmax=z.max()/2)# 压缩色阶范围

# 关键标注
ax.scatter(df>15].geometry.x,
         df>15].geometry.y,
         s=50, c='black', marker='x',
         label='高死亡率点位(>15%)')

plt.colorbar(cf).set_label('核密度值(log)')
plt.savefig('heatmap_raw.svg', bbox_inches='tight')# 矢量格式输出

FishC 发表于 前天 21:08

以下是修正后的Python代码,用于生成医疗数据核密度热力图:

import geopandas as gpd
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
import numpy as np# 补充缺失的numpy导入

# 数据加载
df = gpd.read_file('medical_data.geojson')# 确保文件路径正确

# 提取坐标点 (假设为Point几何类型)
coords = np.array([(pt.x, pt.y) for pt in df.geometry])

# 核密度估计 (带宽根据Silverman规则调整)
kde = KernelDensity(bandwidth=0.15, kernel='epanechnikov')
kde.fit(coords)

# 生成网格
xmin, ymin, xmax, ymax = df.total_bounds
xx, yy = np.mgrid# 500x500网格
grid_points = np.vstack().T
z = np.exp(kde.score_samples(grid_points))
z = z.reshape(xx.shape)

# 可视化设置
fig, ax = plt.subplots(figsize=(15, 10))
basemap = gpd.read_file('tibet_boundary.shp')# 西藏底图
basemap.plot(ax=ax, color='#f0f0f0', edgecolor='#999999')

# 绘制热力图
cf = ax.contourf(xx, yy, z,
                levels=20,
                cmap='RdYlGn_r',# 红-黄-绿渐变色
                alpha=0.7,
                vmin=0, vmax=z.max()/2)# 压缩色阶范围

# 添加高死亡率标注 (假设有'mortality_rate'字段)
if 'mortality_rate' in df.columns:
    high_mortality = df > 15]
    ax.scatter(high_mortality.geometry.x,
               high_mortality.geometry.y,
               s=50, c='black', marker='x',
               label='高死亡率点位(>15%)')

plt.colorbar(cf).set_label('核密度值')
plt.legend()
plt.savefig('heatmap_raw.svg', bbox_inches='tight')

### 关键修正说明:
1. 补充numpy导入:添加了 import numpy as np
2. 坐标提取修正:使用列表推导式正确获取所有点的坐标
3. 网格生成修正:使用 np.mgrid 生成500x500网格
4. 标注逻辑完善:
   - 添加字段存在性检查 if 'mortality_rate' in df.columns
   - 修正筛选条件为 df['mortality_rate'] > 15
5. 添加图例:补充了 plt.legend()

### 使用前检查:
1. 确保GeoJSON和SHP文件存在且路径正确
2. 医疗数据需包含点几何和 mortality_rate 字段(用于标注)
3. 安装依赖库:
pip install geopandas matplotlib scikit-learn

### 参数调整建议:
- 带宽bandwidth:值越小密度越集中,越大越平滑
- 色阶vmax:调整 vmax=z.max()*0.7 可改变颜色分布
- 透明度alpha:降低数值可使底图更清晰

> 注意:实际运行时请根据数据分布调整带宽参数,Silverman规则建议值可通过 KernelDensity(kernel='gaussian').fit(coords).bandwidth 计算参考值

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Python运行成热力图,谢谢大佬