|
当然可以帮你运行这串代码!以下是完整可运行的代码,我修复了原代码中的关键问题:
- import geopandas as gpd
- import matplotlib.pyplot as plt
- import numpy as np
- from sklearn.neighbors import KernelDensity
- # 1. 数据加载 (替换为你的实际文件路径)
- df = gpd.read_file('medical_data.geojson') # 医疗空间数据
- # 2. 提取坐标点 (关键修正)
- coords = np.vstack([df.geometry.x, df.geometry.y]).T
- # 3. 核密度估计
- kde = KernelDensity(bandwidth=0.15, kernel='epanechnikov')
- kde.fit(coords)
- # 4. 生成网格
- xmin, ymin, xmax, ymax = df.total_bounds
- grid_size = 200 # 减小网格密度避免内存问题
- xx, yy = np.mgrid[xmin:xmax:grid_size*1j, ymin:ymax:grid_size*1j]
- grid_points = np.vstack([xx.ravel(), yy.ravel()]).T
- # 5. 计算密度值
- log_density = kde.score_samples(grid_points)
- z = np.exp(log_density).reshape(xx.shape)
- # 6. 可视化
- fig, ax = plt.subplots(figsize=(15, 10))
- basemap = gpd.read_file('tibet_boundary.shp') # 西藏底图
- basemap.plot(ax=ax, color='#f0f0f0', edgecolor='#999999')
- # 7. 热力图层
- cf = ax.contourf(xx, yy, z,
- levels=20,
- cmap='RdYlGn_r', # 红-黄-绿色阶
- alpha=0.7,
- vmin=0,
- vmax=z.max()/2) # 压缩色阶范围
- # 8. 高死亡率点位标注 (假设数据中有'mortality'列)
- high_mortality = df[df['mortality'] > 15] # 关键修正:使用列名筛选
- ax.scatter(high_mortality.geometry.x,
- high_mortality.geometry.y,
- s=50, c='black', marker='x',
- label='高死亡率点位(>15%)')
- # 9. 添加图例和色标
- ax.legend(loc='upper right')
- cbar = plt.colorbar(cf)
- cbar.set_label('核密度值')
- # 10. 保存和显示
- plt.savefig('medical_heatmap.png', dpi=300, bbox_inches='tight')
- plt.title('西藏地区医疗点分布热力图')
- plt.show()
复制代码
### 运行步骤:
1. 确保安装所需库:
pip install geopandas matplotlib scikit-learn numpy
2. 准备数据文件:
- medical_data.geojson(需包含点数据和'mortality'列)
- tibet_boundary.shp(西藏边界底图)
3. 关键修改说明:
- 修复坐标提取:np.vstack([df.geometry.x, df.geometry.y]).T
- 修正网格生成:np.mgrid[xmin:xmax:grid_size*1j, ...]
- 添加死亡率筛选:df[df['mortality'] > 15]
- 减小网格密度:grid_size=200 避免内存溢出
4. 输出结果:
- 热力图层:红(高密度)→黄→绿(低密度)
- 黑色叉号:标记死亡率>15%的特殊点位
- 图片保存为 medical_heatmap.png
> 如果遇到内存问题,可以进一步减小 grid_size 值(建议100-300之间)。实际运行前请确保数据中的列名与代码一致!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|