介绍
热图经常用于可视化事件发生或密度。有一些Python库或GIS软件/工具可用于创建热像图,如QGIS,ArcGIS, Google Table Fusion等。不幸的是,这篇文章不会讨论如何使用这些软件/工具创建热图,但更多除此之外,我们将编写自己的代码,使用Python公共库从头开始在Python 3中创建热图。
将用于在Python中创建热图的算法是核密度估计(KDE)。请参阅这篇文章(使用KDE说明的QGIS热图)以获得有关KDE和另一篇文章(热图计算教程)的更多解释,其中给出了如何使用KDE计算参考点的点强度的示例
导入库
实际上,Python中有一些库可以用来创建像Scikit-learn 或 Seaborn这样的热图 。但是我们只会使用一些库,例如matplotlib,numpy和math。所以我们开始导入这三个库。
import matplotlib.pyplot as plt
import numpy as np
import math
热图数据集
要创建热图,我们需要一个由x,y坐标组成的点数据集。这里我们为x和y创建两个列表。数据集的图可以在图1中看到。
当然这边的数据集也可以是不同的概率等等,只要是能在二维直角坐标中表示出来的都可以算作数据集来源
网格大小和半径
在使用KDE创建热图时,我们需要指定内核形状的带宽或半径以及输出网格大小。对于这种情况,我使用半径10米和网格大小1米。稍后您可以更改这些参数以查看它们如何影响热图结果
# DEFINE GRID SIZE AND RADIUS(h) 下降梯度和redius
grid_size = 1
h = 10
获取X,Y Min / Max构建网格
要构建网格,我们使用网格。因此,我们需要找到x,y最小值和最大值来生成序列号x和y。然后,这些序列号将用于构建网格。为了将所有数据集覆盖范围包含更多的空间,我用半径减去x,y最小值,并将其加到x,y最大值。
# GETTING X,Y MIN AND MAX 获取x和y的最大最小值
x_min = min(x)
x_max = max(x)
y_min = min(y)
y_max = max(y)
# CONSTRUCT GRID
x_grid = np.arange(x_min - h, x_max + h, grid_size)
y_grid = np.arange(y_min - h, y_max + h, grid_size)
x_mesh, y_mesh = np.meshgrid(x_grid, y_grid)
计算网格中心点
构建网格后。接下来,我们计算每个网格的中心点。这可以通过添加x网格和y网格坐标以及网格大小的一半来完成。稍后将使用中心点来计算每个网格到数据集点的距离。
# GRID CENTER POINT,中心点(xc,yc)
xc = x_mesh + (grid_size / 2)
yc = y_mesh + (grid_size / 2)
核密度估计函数
为了计算点密度或强度,我们使用一个名为kde_quartic的函数。我们使用的是Quartic内核形状,这就是为什么它在函数名中有“四分”术语。该函数有两个参数:点距离(d)和内核半径(h)。
# FUNCTION TO CALCULATE INTENSITY WITH QUARTIC KERNEL
def kde_quartic(d, h):
dn = d / h
P = (15 / 16) * (1 - dn ** 2) ** 2
return P
计算每个网格的密度值
这是这篇文章中最难的部分。计算每个网格的密度值。我们在三个循环中这样做。第一个循环用于网格数据列表或网格。这些网格和第三个循环的每个中心点的第二个循环用于计算中心点到每个数据集点的距离。使用距离,然后我们使用之前已定义的kde_quartic函数计算每个网格的密度值。它将返回到数据点的每个距离的密度值。这里我们只考虑内核半径内距离的点。我们不考虑内核半径之外的点并将密度值设置为0.然后我们总结网格的所有密度值以获得相应网格的总密度值。然后将总密度值存储在列表中。叫强度列表。
可视化结果
最后一部分我们使用matplotlib颜色网格可视化结果。我们还添加了一个颜色条来查看强度值。热图结果如图2所示。
# HEATMAP OUTPUT
plt.plot(x,y)
intensity = np.array(intensity_list)
plt.pcolormesh(x_mesh, y_mesh, intensity)
plt.plot(x, y, 'ro')
plt.colorbar()
plt.show()
本文转自https://blog.youkuaiyun.com/qq_23981335/article/details/82833136