在Python中生成热图
我想制作一个热力图,类似于这个回答中的图。不同的是,我想用一个包含0到1之间值的二维数组来生成这个图。
我尝试过的:
def generate_x_y_vectors(prob_map):
multiplier = 100
xs = []
ys = []
for y in range(len(prob_map)):
for x in range(len(prob_map[y])):
count = int(prob_map[y][x] * multiplier)
xs.extend([x] * count)
ys.extend([y] * count)
return (xs, ys)
def heatmap(probabilities):
#probabilities is a 2d nxn array
n = len(probability_map)
gridsize = n + 1
(xs, ys) = generate_x_y_vectors(probability_map)
plt.figure()
plt.hexbin(xs, ys, C=None, gridsize=gridsize, mincnt=1)
plt.axis([0, n, 0, n])
我遇到的主要问题是,我无法调整网格大小来制作一个整齐的图——很多空白区域导致了条纹效果等等。
无论如何,我想这应该有更好的方法来实现这个,而不需要繁琐地生成点!
理想情况下,我希望有一种机制来决定是否绘制六边形(就像我上面做的那样)。
我的动机是我有一个简单的两个变量的马尔可夫链,其中两个变量的和不能超过某个值n。我有一个数组,里面存储了每个初始条件的概率。所以这个热力图应该是一个三角形,包含在x < n-y的区域内。
2 个回答
0
这是一个完整的命令行工具,可以从特定地点的监控视频中生成热力图。
你可以在这里找到这个工具:https://github.com/ajayrawat12/generate_heatmap
3
我不太确定你想用你的代码做什么。
我理解你的意思是:
“通过六边形图显示一个二维图像”。
关于“决定是否显示六边形”的部分,似乎和hexbin中的mincnt参数有关。这个参数的意思是:如果设置了这个值,那么只会显示包含超过mincnt个点的单元格。对于更复杂的情况,你需要从x、y和C生成掩码数组。
这就是你想要做的事情吗?如果是这样,下面的代码应该能给你一个起点:
import numpy as np
import matplotlib.pyplot as plt
def generate_x_y(prob_map):
s = prob_map.shape
x, y = np.meshgrid(np.arange(s[0]), np.arange(s[1]))
return x.ravel(), y.ravel()
def heatmap(prob_map):
x, y = generate_x_y(prob_map)
plt.figure()
plt.hexbin(x, y, C=prob_map.ravel())
probs = np.random.rand(200, 200)
heatmap(probs)
plt.show()
与您的函数相比,增加了以下内容:
probs = np.random.rand(200, 200)
heatmap(probs)
plt.show()
可以在这些图中看到区别:
来自你代码的图(包括条纹):
来自我代码的图(看起来就是随机的):