|
发表于 2025-8-12 21:09:31
From FishC Mobile
|
显示全部楼层
|阅读模式
50鱼币
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([df.geometry.x, df.geometry.y]).T
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) # 压缩色阶范围
# 关键标注
ax.scatter(df[df['mortality']>15].geometry.x,
df[df['mortality']>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') # 矢量格式输出
以下是修正后的Python代码,用于生成医疗数据热力图并叠加高死亡率点位标注:
- import geopandas as gpd
- import matplotlib.pyplot as plt
- import numpy as np
- from sklearn.neighbors import KernelDensity
- # 数据加载
- df = gpd.read_file('medical_data.geojson') # 医疗空间数据
- # 提取坐标点 (修正点)
- coords = np.vstack([df.geometry.x, df.geometry.y]).T
- # 核密度估计
- kde = KernelDensity(bandwidth=0.15, kernel='epanechnikov')
- kde.fit(coords)
- # 生成网格
- xmin, ymin, xmax, ymax = df.total_bounds
- grid_size = 500
- xx, yy = np.mgrid[xmin:xmax:grid_size*1j, ymin:ymax:grid_size*1j] # 500x500网格
- grid_points = np.vstack([xx.ravel(), yy.ravel()]).T
- # 计算密度值
- log_density = kde.score_samples(grid_points)
- z = np.exp(log_density).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) # 压缩色阶范围
- # 高死亡率点位标注 (修正筛选条件)
- high_mortality = df[df['mortality'] > 15] # 假设存在死亡率列'mortality'
- ax.scatter(high_mortality.geometry.x,
- high_mortality.geometry.y,
- s=50, c='black', marker='x',
- label='高死亡率点位(>15%)')
- # 添加图例和色标
- ax.legend(loc='upper right')
- cbar = plt.colorbar(cf)
- cbar.set_label('核密度值(log)')
- plt.savefig('heatmap_raw.svg', bbox_inches='tight') # 矢量格式输出
- plt.show()
复制代码
### 关键修正说明:
1. 坐标提取:使用 df.geometry.x 和 df.geometry.y 正确获取点坐标
2. 网格生成:使用 np.mgrid[xmin:xmax:grid_size*1j] 创建等间距网格
3. 高死亡率筛选:假设数据存在 'mortality' 列,使用布尔索引筛选
4. 缺失库导入:补充了 import numpy as np
### 使用前检查:
1. 确保GeoJSON数据包含点几何和 'mortality' 字段
2. 西藏底图应为面状Shapefile
3. 带宽参数 bandwidth=0.15 可根据数据分布调整
### 输出效果:
- 灰色底图:西藏行政区划
- 彩色热力图:医疗点密度分布(红色高密度,绿色低密度)
- 黑色叉号:死亡率>15%的特殊点位
> 提示:若遇内存问题,可减少 grid_size 值(如改为200)
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
最佳答案
查看完整内容
以下是修正后的Python代码,用于生成医疗数据热力图并叠加高死亡率点位标注:
### 关键修正说明:
1. 坐标提取:使用 df.geometry.x 和 df.geometry.y 正确获取点坐标
2. 网格生成:使用 np.mgrid[xmin:xmax:grid_size*1j] 创建等间距网格
3. 高死亡率筛选:假设数据存在 'mortality' 列,使用布尔索引筛选
4. 缺失库导入:补充了 import numpy as np
### 使用前检查:
1. 确保GeoJSON数据包含点几何和 'mortality' ...
|