2017-02-18 80 views
2

只是为了好玩,我想编写一个鼠标跟踪脚本,我有基本的部分工作,但我在使用热图绝对没有运气。Python的热图的屏幕坐标的字典和频率

我最初的代码是拯救通过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

+0

该代码应该工作,只要你的数据字典确实格式化为你期望的那样。在我看来,你只是绘制零点,所以我会建议看看你的尝试/除了语句 –

+0

发生了什么好吧,如果你看看它的工作更高的分辨率,但只绘制单个像素。我在blob样式heatmap的东西 – Peter

回答

2

我密谋这样的热图的解决方案如下。填充2D numpy阵列很容易,数据取自data[(x, y)],然后使用plot函数。请注意,您可以使用任何您喜欢的颜色映射,我使用代码中提供的颜色映射。样品应该开箱即用。

的“滴状”的外观可以使用高斯模糊来实现。您可以调整西格玛以使其更清晰或更平滑。

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'也给出了所需的外观开箱。

+0

谢谢,这是否适用于我瞄准的热图的样式?有一个快速的外观,但它似乎都是彩色:) – Peter

+0

当然,只需使用'cmap ='hot''而不是我的自定义颜色映射。 –

+0

刚刚看到您的编辑。那么,我的自定义色彩贴图非常接近你所需要的,除了我用白色对零密度区域进行着色之外。我认为你可以将颜色图调整为如下形式:'colors = [(0,0,1),(0,1,1),(0,1,0.75),(0,1,0),(0.75 ,1,0,0),(1,1,0),(1,0.8,0),(1,0.7,0),(1,0.0,0)]'。只要玩它:) –