2017-02-18 41 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)]'。只要玩它:) –