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

时间:2017-02-18 14:00:59

标签: python matplotlib heatmap

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

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

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

enter image description here

这不是没有用,但它绝对不是我希望看到的结果。我想知道是否有人知道我实际上如何获得其他类型的热图,你会得到热量的斑点?我一直在谷歌搜索一些条款,但似乎又回到了同样的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()

速度并不重要,因为它与跟踪分开进行,我只是喜欢最初有用的东西。

编辑:只是为了清理一下(如果不清楚则道歉),这样的话就是我想要的: enter image description here

1 个答案:

答案 0 :(得分:2)

我绘制此类热图的解决方案如下。使用import scrapy class BrickSetSpider(scrapy.Spider): name = "brickset_spider" start_urls = ['http://brickset.com/sets/year-2016'] def parse(self, response): SET_SELECTOR = '.set' for brickset in response.css(SET_SELECTOR): NAME_SELECTOR = 'h1 a ::text' PIECES_SELECTOR = './/dl[dt/text() = "Pieces"]/dd/a/text()' MINIFIGS_SELECTOR = './/dl[dt/text() = "Minifigs"]/dd[2]/a/text()' IMAGE_SELECTOR = 'img ::attr(src)' yield { 'name': brickset.css(NAME_SELECTOR).extract_first(), 'pieces': brickset.xpath(PIECES_SELECTOR).extract_first(), 'minifigs': brickset.xpath(MINIFIGS_SELECTOR).extract_first(), 'image': brickset.css(IMAGE_SELECTOR).extract_first(), } NEXT_PAGE_SELECTOR = '.next a ::attr(href)' next_page = response.css(NEXT_PAGE_SELECTOR).extract_first() if next_page: yield scrapy.Request( response.urljoin(next_page), callback=self.parse ) 数据填充2D numpy数组很容易,然后使用data[(x, y)]函数。请注意,您可以使用任何您喜欢的色彩映射,我使用代码中提供的色彩映射。样本应该开箱即用。

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

plot

P.S。 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') 也提供了开箱即用的所需外观。