1

我想生成一个类似于此答案中的热图图像。不同之处在于我想从 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])

这样做的主要问题是我无法调整网格大小来制作整洁的地图 - 大量空白最终会产生条纹效果 / 等等。

无论哪种情况,我都想有一种更好的方法可以做到这一点,而不必经历繁琐的积分生成!

理想情况下,我想要一些机制来限制是否绘制六边形(正如我在上面所做的那样)。

我的动机是我有一个简单的 2 变量马尔可夫链,其中 2 个变量的总和不能超过某个值 n。我有一个数组,每个初始条件都有一定的概率。所以热图将是一个由区域 x < ny 包围的三角形。

4

2 回答 2

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

可以在这些图中看到:从您的代码(包括条纹):

在此处输入图像描述

从我的代码(应该是随机的):

在此处输入图像描述

于 2011-09-11T06:35:38.383 回答
0

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

https://github.com/ajayrawat12/generate_heatmap

于 2019-01-08T17:39:10.007 回答