在Python中生成热图

1 投票
2 回答
5791 浏览
提问于 2025-04-17 01:58

我想制作一个热力图,类似于这个回答中的图。不同的是,我想用一个包含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()

可以在这些图中看到区别:

来自你代码的图(包括条纹):

在这里输入图像描述

来自我代码的图(看起来就是随机的):

在这里输入图像描述

撰写回答