Python运行成热力图,谢谢大佬
import geopandas as gpdimport 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')# 矢量格式输出 以下是修正后的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]