在Python中生成热图

时间:2011-09-10 14:03:59

标签: python matplotlib heatmap

我想生成类似于此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 <所包含的三角形。正收率

2 个答案:

答案 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()

可以在这些数字中看到: 从你的代码(包括条纹):

enter image description here

来自我的代码(就像它应该是随机的):

enter image description here

答案 1 :(得分:0)

一个完整的热图生成命令行工具,来自特定地方的cctv视频。

https://github.com/ajayrawat12/generate_heatmap