屏幕坐标和频率字典的Python热图
只是为了好玩,我试着编写一个鼠标跟踪脚本,我有基本的部分工作,但我绝对没有热图运气 我最初的代码是通过PIL保存一个图像(只是为了检查它是否正常工作),这很好,但显然它只是一个点。然后我试着实现我自己的热图,但发现它需要花半年多的时间来处理一些真正基本的东西,所以这也行不通 我一直在尝试matplotlib的不同示例,但我刚刚意识到“热图”在本例中的含义有所不同 这不起作用,但也肯定不是我希望看到的结果。我想知道是否有人知道我是如何得到另一种类型的热图的,你从哪里得到的热量?我在谷歌上搜索了很多术语,但似乎又回到了同样的3个左右的问题 数据存储在屏幕坐标和频率字典的Python热图,python,matplotlib,heatmap,Python,Matplotlib,Heatmap,只是为了好玩,我试着编写一个鼠标跟踪脚本,我有基本的部分工作,但我绝对没有热图运气 我最初的代码是通过PIL保存一个图像(只是为了检查它是否正常工作),这很好,但显然它只是一个点。然后我试着实现我自己的热图,但发现它需要花半年多的时间来处理一些真正基本的东西,所以这也行不通 我一直在尝试matplotlib的不同示例,但我刚刚意识到“热图”在本例中的含义有所不同 这不起作用,但也肯定不是我希望看到的结果。我想知道是否有人知道我是如何得到另一种类型的热图的,你从哪里得到的热量?我在谷歌上搜索了很
{(x,y):frequency}
的字典中,因此为了得到上面的结果,我使用了以下代码(matplotlib部分来自):
它的速度并不重要,因为它将与跟踪分开进行,我只想要一些最初可以工作的东西
编辑:只是想澄清一下(如果不清楚,请道歉),我希望这样:
我绘制此类热图的解决方案如下。很容易用数据填充2D numpy数组,获取
数据[(x,y)]
,然后使用绘图
功能。请注意,您可以使用任何您喜欢的颜色映射,我使用代码中提供的颜色映射。样品应该是开箱即用的
使用高斯模糊可以获得“块状”外观。您可以调整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'
还提供了所需的开箱即用的外观。只要数据字典的格式确实符合您的预期,代码就应该可以工作。在我看来,您只是在绘制零,因此我建议您查看try/except语句中发生的情况。如果您查看更高的分辨率,它确实有效,但仅绘制单个像素。我想要的是blob风格的热图谢谢,这会适用于我想要的热图风格吗?快速查看了一下,但看起来都是彩色的:)当然,只需使用cmap='hot'
而不是我的自定义颜色映射。刚刚看到您的编辑。嗯,我的自定义颜色贴图非常接近您需要的颜色,除了我用白色为零密度区域着色。我认为您可以将颜色映射调整为如下内容: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,0)]
。玩一下:)另一个选项是使用OpenCV的cv2.applyColorMap()
函数。顺便说一下,我刚刚意识到cmap='jet'
也提供了所需的开箱即用的外观。
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')