鱼C论坛

 找回密码
 立即注册
查看: 96|回复: 1

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

[复制链接]
发表于 2025-8-12 21:07:07 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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')  # 矢量格式输出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-12 21:08:25 | 显示全部楼层
以下是修正后的Python代码,用于生成医疗数据核密度热力图:

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

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

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

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

  12. # 生成网格
  13. xmin, ymin, xmax, ymax = df.total_bounds
  14. xx, yy = np.mgrid[xmin:xmax:500j, ymin:ymax:500j]  # 500x500网格
  15. grid_points = np.vstack([xx.ravel(), yy.ravel()]).T
  16. z = np.exp(kde.score_samples(grid_points))
  17. z = z.reshape(xx.shape)

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

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

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

  35. plt.colorbar(cf).set_label('核密度值')
  36. plt.legend()
  37. 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. 安装依赖库:
  1. pip install geopandas matplotlib scikit-learn
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-1 11:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表