我想生成类似于此answer中的热图图像。不同之处在于我想从0到1之间的2d数组中做到这一点。
我尝试过:
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])
这个问题的主要问题是我无法调整gridsize以制作整洁的地图 - 许多白色空间最终会产生条纹效果等等。
在任何一种情况下,我都认为有更好的方法可以做到这一点,而不必经历繁琐的点数生成!
理想情况下,我想要一些机制来判断是否绘制六边形(如上所述)。
我的动机是我有一个简单的2变量马尔可夫链,其中2个变量的总和不能超过某个值,n。我有一个数组,每个初始条件有一定概率。因此,热图将是由区域x <所包含的三角形。正收率
答案 0 :(得分:3)
我不确定你想用你的代码做什么。 我把它读作:
“通过hexbin显示2d图像”。
“显示六边形或不显示六边形的阈值”部分看起来像是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()
可以在这些数字中看到: 从你的代码(包括条纹):
来自我的代码(就像它应该是随机的):
答案 1 :(得分:0)
一个完整的热图生成命令行工具,来自特定地方的cctv视频。