Python 屏幕坐标和频率字典的热图
Python heatmap for a dictionary of screen coordinates and frequency
只是为了好玩,我正在尝试编写一个鼠标跟踪脚本,我的基本部分在工作,但我在热图方面绝对没有运气。
我最初的代码是通过 PIL 保存图像(只是为了检查它是否工作),这很好,但显然它只是单个点。然后我尝试实现我自己的热图,但发现它需要半年多的时间来处理一些非常基本的东西,所以这也行不通。
我一直在尝试不同的 matplotlib 示例,但我刚刚意识到 "heat map" 在这种情况下意味着不同的东西。
不是不行,但也绝对不是我希望看到的结果。我想知道是否有人知道我实际上是如何获得其他类型的热图的,从哪里得到热斑点?我一直在谷歌搜索一堆术语,但它似乎又回到了同样的 3 个左右的问题。
数据存储在{(x, y): frequency}
的字典中,所以为了得到上面的结果我使用了这段代码(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()
它的速度并不重要,因为它将与跟踪分开进行,我只是想要最初能工作的东西。
编辑:稍微澄清一下(如果不清楚,请见谅),我想要这样的东西:
我绘制此类热图的解决方案如下。用你的数据填充 2D numpy 数组很容易 data[(x, y)]
,然后使用 plot
函数。请注意,您可以使用任何您喜欢的颜色图,我使用代码中提供的那个。该示例应该开箱即用。
"blobby" 外观可以使用高斯模糊来实现。您可以调整 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'
也提供了开箱即用的所需外观。
只是为了好玩,我正在尝试编写一个鼠标跟踪脚本,我的基本部分在工作,但我在热图方面绝对没有运气。
我最初的代码是通过 PIL 保存图像(只是为了检查它是否工作),这很好,但显然它只是单个点。然后我尝试实现我自己的热图,但发现它需要半年多的时间来处理一些非常基本的东西,所以这也行不通。
我一直在尝试不同的 matplotlib 示例,但我刚刚意识到 "heat map" 在这种情况下意味着不同的东西。
不是不行,但也绝对不是我希望看到的结果。我想知道是否有人知道我实际上是如何获得其他类型的热图的,从哪里得到热斑点?我一直在谷歌搜索一堆术语,但它似乎又回到了同样的 3 个左右的问题。
数据存储在{(x, y): frequency}
的字典中,所以为了得到上面的结果我使用了这段代码(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()
它的速度并不重要,因为它将与跟踪分开进行,我只是想要最初能工作的东西。
编辑:稍微澄清一下(如果不清楚,请见谅),我想要这样的东西:
我绘制此类热图的解决方案如下。用你的数据填充 2D numpy 数组很容易 data[(x, y)]
,然后使用 plot
函数。请注意,您可以使用任何您喜欢的颜色图,我使用代码中提供的那个。该示例应该开箱即用。
"blobby" 外观可以使用高斯模糊来实现。您可以调整 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'
也提供了开箱即用的所需外观。