楼主: 时光人
1963 2

在Python中从头开始创建热图 [推广有奖]

  • 3关注
  • 34粉丝

已卖:165份资源

院士

23%

还不是VIP/贵宾

-

威望
1
论坛币
26913 个
通用积分
429.8724
学术水平
95 点
热心指数
109 点
信用等级
91 点
经验
39970 点
帖子
1630
精华
3
在线时间
580 小时
注册时间
2019-2-25
最后登录
2025-5-6

楼主
时光人 学生认证  发表于 2020-10-13 15:08:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
热图通常用于可视化事件的发生或密度。有一些Python库或GIS软件/工具可用于创建热图,例如QGIS,ArcGIS,Google Table Fusion等。不幸的是,本文不会讨论如何使用这些软件/工具创建热图,但更多内容除此之外,我们将编写自己的代码以使用Python公共库从头开始在Python 3中创建热图。

将在Python中创建热图的算法是内核密度估计(KDE)。

导入库实际上,Python中有一些库可用于创建热图,例如Scikit-learn或Seaborn。但是我们将只使用一些库,例如matplotlib,numpy和math。因此,我们从导入这三个库开始。
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import math
复制代码
要创建热图,我们需要一个包含x,y坐标的点数据集。在这里,我们为x和y创建两个列表。数据集图可参见图1。

  1. X = [ 20,28,15,20,18,25,15,18,18,20,25,30,25,22,30,22,38,40,38,30,22,20,35,33 ]
  2. ÿ = [ 20,14,15,20,15,20,32,33,45,50,20,20,20,25,30,38,20,28,33,50,48,40,30,35 ]
复制代码
50CE3040-BA60-4340-9785-27779AF98343.png

网格大小和半径
使用KDE创建热图时,我们需要指定内核形状的带​​宽或半径以及输出网格的大小。对于这种情况,我使用半径10 m和栅格大小1 m。稍后,您可以更改这些参数以查看它们如何影响热图结果。
  1. grid_size = 1
  2. h = 10
复制代码
获取X,Y最小值/最大值以构建网格
要构建网格,我们使用网格。因此,我们需要找到x,y的最小值和最大值以生成x和y的序列号。然后,这些序列号将用于构建网格。为了包括所有具有更大空间的数据集覆盖范围,我用半径减去x,y最小值,然后将其相加为x,y最大值。

  1. #GETTING X,Y MIN AND MAX
  2. x_min=min(x)
  3. x_max=max(x)
  4. y_min=min(y)
  5. y_max=max(y)

  6. #CONSTRUCT GRID
  7. x_grid=np.arange(x_min-h,x_max+h,grid_size)
  8. y_grid=np.arange(y_min-h,y_max+h,grid_size)
  9. x_mesh,y_mesh=np.meshgrid(x_grid,y_grid)
复制代码
计算网格中心点
构造完网格后。接下来,我们计算每个网格的中心点。这可以通过将x网格和y网格坐标与网格大小的一半相加来完成。稍后将使用中心点来计算每个网格到数据集点的距离。

  1. xc=x_mesh+(grid_size/2)
  2. yc=y_mesh+(grid_size/2)
复制代码
核密度估计函数
为了计算点密度或强度,我们使用了一个称为kde_quartic的函数。我们正在使用四次核形状,这就是为什么它在函数名称中使用“四次”项的原因。此函数有两个参数:点距离(d)和核半径(h)。

  1. #使用正交核计算强度的功能
  2. def  kde_quartic(d,h):
  3.     dn = d / h
  4.     P =(15/16)*(1- dn ** 2)** 2
  5.     return P
复制代码
计算每个网格的密度值
这是这篇文章中最难的部分。计算每个网格的密度值。我们通过三个循环来执行此操作。第一个循环用于网格数据列表或网格。这些网格的每个中心点的第二个循环,以及计算中心点到每个数据集点的距离的第三个循环。使用距离,然后使用之前已定义的kde_quartic函数计算每个网格的密度值。它将返回到数据点每个距离的密度值。在这里,我们仅考虑在内核半径内具有一定距离的点。我们不考虑核半径之外的点,而是将密度值设置为0。然后,我们将网格的所有密度值求和,以获得各个网格的总密度值。然后,将总密度值存储在一个列表中,该列表为称为强度列表。

intensity_list=[]
for j in range(len(xc)):
    intensity_row=[]
    for k in range(len(xc[0])):
        kde_value_list=[]
        for i in range(len(x)):
            #CALCULATE DISTANCE
            d=math.sqrt((xc[j][k]-x)**2+(yc[j][k]-y)**2)
            if d<=h:
                p=kde_quartic(d,h)
            else:
                p=0
            kde_value_list.append(p)
        #总和所有强度值
        p_total=sum(kde_value_list)
        intensity_row.append(p_total)
    intensity_list.append(intensity_row)

最后一部分,我们使用matplotlib彩色网格可视化结果。我们还添加了一个颜色条以查看强度值。热图结果如图2所示。
  1. #HEATMAP输出  
复制代码

4F02D4B5-137F-454b-A674-83939F2FA6BC.png





完整的代码段可以在下面找到。
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import math

  4. #POINT DATASET
  5. x=[20,28,15,20,18,25,15,18,18,20,25,30,25,22,30,22,38,40,38,30,22,20,35,33,35]
  6. y=[20,14,15,20,15,20,32,33,45,50,20,20,20,25,30,38,20,28,33,50,48,40,30,35,36]

  7. #DEFINE GRID SIZE AND RADIUS(h)
  8. grid_size=1
  9. h=10

  10. #GETTING X,Y MIN AND MAX
  11. x_min=min(x)
  12. x_max=max(x)
  13. y_min=min(y)
  14. y_max=max(y)

  15. #CONSTRUCT GRID
  16. x_grid=np.arange(x_min-h,x_max+h,grid_size)
  17. y_grid=np.arange(y_min-h,y_max+h,grid_size)
  18. x_mesh,y_mesh=np.meshgrid(x_grid,y_grid)

  19. #GRID CENTER POINT
  20. xc=x_mesh+(grid_size/2)
  21. yc=y_mesh+(grid_size/2)

  22. #FUNCTION TO CALCULATE INTENSITY WITH QUARTIC KERNEL
  23. def kde_quartic(d,h):
  24.     dn=d/h
  25.     P=(15/16)*(1-dn**2)**2
  26.     return P

  27. #PROCESSING
  28. intensity_list=[]
  29. for j in range(len(xc)):
  30.     intensity_row=[]
  31.     for k in range(len(xc[0])):
  32.         kde_value_list=[]
  33.         for i in range(len(x)):
  34.             #CALCULATE DISTANCE
  35.             d=math.sqrt((xc[j][k]-x[i])**2+(yc[j][k]-y[i])**2)
  36.             if d<=h:
  37.                 p=kde_quartic(d,h)
  38.             else:
  39.                 p=0
  40.             kde_value_list.append(p)
  41.         #SUM ALL INTENSITY VALUE
  42.         p_total=sum(kde_value_list)
  43.         intensity_row.append(p_total)
  44.     intensity_list.append(intensity_row)

  45. #HEATMAP OUTPUT   
  46. intensity=np.array(intensity_list)
  47. plt.pcolormesh(x_mesh,y_mesh,intensity)
  48. plt.plot(x,y,'ro')
  49. plt.colorbar()
  50. plt.show()
复制代码


这就是使用KDE从头开始在Python中创建热图的所有方法。还有其他可用的内核形状,例如高斯,三重,Epanechnikov,三角等。请随意添加这些内核形状并修改代码。尝试通过更改一些参数(例如半径和栅格大小)进行实验,并探索结果。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python scikit-learn Matplotlib intensity calculate

已有 2 人评分经验 论坛币 收起 理由
yunnandlg + 80 精彩帖子
happy_287422301 + 100 精彩帖子

总评分: 经验 + 80  论坛币 + 100   查看全部评分

沙发
happy_287422301 在职认证  发表于 2020-10-13 15:56:25
感谢分享。

藤椅
dongdong740226 在职认证  发表于 2020-11-16 15:04:00
棒    

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 11:03