Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
屏幕坐标和频率字典的Python热图_Python_Matplotlib_Heatmap - Fatal编程技术网

屏幕坐标和频率字典的Python热图

屏幕坐标和频率字典的Python热图,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,只是为了好玩,我试着编写一个鼠标跟踪脚本,我有基本的部分工作,但我绝对没有热图运气 我最初的代码是通过PIL保存一个图像(只是为了检查它是否正常工作),这很好,但显然它只是一个点。然后我试着实现我自己的热图,但发现它需要花半年多的时间来处理一些真正基本的东西,所以这也行不通 我一直在尝试matplotlib的不同示例,但我刚刚意识到“热图”在本例中的含义有所不同 这不起作用,但也肯定不是我希望看到的结果。我想知道是否有人知道我是如何得到另一种类型的热图的,你从哪里得到的热量?我在谷歌上搜索了很

只是为了好玩,我试着编写一个鼠标跟踪脚本,我有基本的部分工作,但我绝对没有热图运气

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

我一直在尝试matplotlib的不同示例,但我刚刚意识到“热图”在本例中的含义有所不同

这不起作用,但也肯定不是我希望看到的结果。我想知道是否有人知道我是如何得到另一种类型的热图的,你从哪里得到的热量?我在谷歌上搜索了很多术语,但似乎又回到了同样的3个左右的问题

数据存储在
{(x,y):frequency}
的字典中,因此为了得到上面的结果,我使用了以下代码(matplotlib部分来自):

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

编辑:只是想澄清一下(如果不清楚,请道歉),我希望这样:

我绘制此类热图的解决方案如下。很容易用数据填充2D numpy数组,获取
数据[(x,y)]
,然后使用
绘图
功能。请注意,您可以使用任何您喜欢的颜色映射,我使用代码中提供的颜色映射。样品应该是开箱即用的

使用高斯模糊可以获得“块状”外观。您可以调整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'
还提供了所需的开箱即用的外观。

只要数据字典的格式确实符合您的预期,代码就应该可以工作。在我看来,您只是在绘制零,因此我建议您查看try/except语句中发生的情况。如果您查看更高的分辨率,它确实有效,但仅绘制单个像素。我想要的是blob风格的热图谢谢,这会适用于我想要的热图风格吗?快速查看了一下,但看起来都是彩色的:)当然,只需使用
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'
也提供了所需的开箱即用的外观。
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')