【问题标题】:Python heatmap for a dictionary of screen coordinates and frequency用于屏幕坐标和频率字典的 Python 热图
【发布时间】:2017-07-08 01:14:22
【问题描述】:

只是为了好玩,我正在尝试编写鼠标跟踪脚本,我已经完成了基本部分,但我对热图完全没有运气。

我的初始代码是通过 PIL 保存图像(只是为了检查它是否工作),这很好,但显然它只是单个点。然后我尝试实现自己的热图,但发现对于一些非常基本的东西需要半年以上的处理时间,所以这也行不通。

我一直在尝试不同的 matplotlib 示例,但我刚刚意识到“热图”在这种情况下意味着不同的东西。

这不是没有用,但也绝对不是我希望看到的结果。我想知道是否有人知道我实际上将如何获得另一种类型的热图,你会在哪里得到热量?我一直在谷歌上搜索一堆术语,但似乎又回到了相同的 3 个左右的问题。

数据存储在{(x, y): frequency}的字典中,所以为了得到上面的结果,我使用了这段代码(matplotlib部分来自Plotting a 2D heatmap with Matplotlib):

import matplotlib.pyplot as plt

resolution = (1920, 1080)

total = []
for y in range(resolution[1]):
    row = []
    for x in range(resolution[0]):
        try:
            row.append(data[(x, y)])
        except KeyError:
            row.append(0)
    total.append(row)

plt.imshow(total, cmap='hot', interpolation='nearest')
plt.show()

它的速度并不重要,因为它将与跟踪分开完成,我只是想要一些最初可以工作的东西。

编辑:只是为了澄清一点(如果不清楚,请道歉),我想要这样的东西:

【问题讨论】:

  • 该代码应该可以工作,只要您的数据字典确实按照您的预期格式化。在我看来,你只是在绘制零,所以我建议你看看你的 try/except 语句中发生了什么
  • 好吧,如果您查看更高的分辨率,它确实可以工作,但只会绘制单个像素。我追求的是blob风格的热图

标签: python matplotlib heatmap


【解决方案1】:

我绘制此类热图的解决方案如下。使用data[(x, y)] 的数据填充二维numpy 数组很容易,然后使用plot 函数。请注意,您可以使用任何您喜欢的颜色图,我使用代码中提供的颜色图。该示例应该开箱即用。

使用高斯模糊可以实现“斑点”外观。您可以调整 sigma 以使其更清晰或更平滑。

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np

import scipy.ndimage.filters as filters


def plot(data, title, save_path):
    colors = [(0, 0, 1), (0, 1, 1), (0, 1, 0.75), (0, 1, 0), (0.75, 1, 0),
              (1, 1, 0), (1, 0.8, 0), (1, 0.7, 0), (1, 0, 0)]

    cm = LinearSegmentedColormap.from_list('sample', colors)

    plt.imshow(data, cmap=cm)
    plt.colorbar()
    plt.title(title)
    plt.savefig(save_path)
    plt.close()

if __name__ == "__main__":
    w = 640
    h = 480

    data = np.zeros(h * w)
    data = data.reshape((h, w))

    # Create a sharp square peak, just for example
    for x in range(300, 340):
        for y in range(300, 340):
            data[x][y] = 100

    # Smooth it to create a "blobby" look
    data = filters.gaussian_filter(data, sigma=15)

    plot(data, 'Sample plot', 'sample.jpg')

P.S.cmap='jet' 还提供了开箱即用的所需外观。

【讨论】:

  • 谢谢,这是否适用于我想要的热图风格?快速浏览了一下,但似乎都是彩色的:)
  • 当然,只需使用cmap='hot' 而不是我的自定义颜色图。
  • 刚刚看到您的编辑。好吧,我的自定义颜色图非常接近您的需要,除了我用白色为零密度区域着色。我认为您可以将颜色图调整为:colors = [(0, 0, 1), (0, 1, 1), (0, 1, 0.75), (0, 1, 0), (0.75, 1, 0), (1, 1, 0), (1, 0.8, 0), (1, 0.7, 0), (1, 0.0, 0)]。随便玩吧:)
  • 另一种选择是使用 OpenCV 的 cv2.applyColorMap() 函数。
  • 顺便说一句,我刚刚意识到cmap='jet' 也提供了开箱即用的所需外观。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
相关资源
最近更新 更多