|
发表于 2025-8-12 21:08:25
|
显示全部楼层
以下是修正后的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[xmin:xmax:500j, ymin:ymax:500j] # 500x500网格
- grid_points = np.vstack([xx.ravel(), yy.ravel()]).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[df['mortality_rate'] > 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[xmin:xmax:500j, ymin:ymax:500j] 生成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 小助理,如未能正确解答您的问题,请继续追问。 |
|