2017-02-18 6 views
2

재미있는 부분을 살펴보면 마우스 추적 스크립트를 코딩하려고하는데 기본 부분이 작동하지만 히트 맵을 사용할 수 없습니다.화면 좌표 및 주파수 사전에 대한 Python 히트 맵

초기 코드는 PIL을 통해 이미지를 저장하는 것이 었습니다 (제대로 작동하는지 확인하기 위해).하지만 괜찮 았지만 분명히 단 하나의 점이었습니다. 그런 다음 자신의 히트 맵을 구현하려했지만 실제로 기본 작업을 수행하는 데는 반 년 이상 걸리는 것으로 나타났습니다. 따라서이 중 하나도 작동하지 않았습니다.

나는 matplotlib의 다른 예를 시도해 왔지만, "열지도"가이 경우 다른 것을 의미한다는 것을 깨달았습니다.

enter image description here

이 작동하지 아니에요,하지만 확실히 또한 내가보기를 바라고 한 결과이 아니다. 누군가 열의 다른 유형을 얻는 방법에 대해 아는 사람이 있는지 궁금합니다. 나는 많은 용어를 인터넷 검색하고 있지만 그것은 같은 3 또는 그래서 다시 질문으로 이어질 것으로 보인다.

데이터는 (하기 matplotlib 부분은 Plotting a 2D heatmap with Matplotlib에서 가져온)이 코드를 사용 위에 그래서 결과를 얻을 수, {(x, y): frequency}의 사전에 저장됩니다

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

데이터 딕셔너리가 예상대로 포맷 된 경우 해당 코드가 작동해야합니다. 제 생각에는 당신이 단지 제로를 그리는 것 같아서, 당신의 try/except 문에서 무슨 일이 일어나는지 살펴볼 것을 제안 할 것입니다. –

+0

고해상도를 보면 작동하지만 개별 픽셀 만 표시합니다. 나는 BLOB 스타일의 heatmap stuff을 보냈다. – Peter

답변

2

내 솔루션입니다. 데이터가 data[(x, y)] 인 2D numpy 배열을 쉽게 채우고 plot 함수를 사용하십시오. 원하는 색상 표를 사용할 수 있으며 코드에 표시된 색상 표를 사용합니다. 샘플은 상자에서 잘 작동합니다.

"blobby"모양은 가우시안 블러를 사용하여 얻을 수 있습니다. 시그마를보다 선명하고 부드럽게 조정할 수 있습니다.

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), , (1,0,0), (1,0,0), (1, 0.8,0), (1, 0.7, 0), (1, 0.0, 0) 그냥 그걸로 놀아 라 :) –