我尝试制作一个程序,根据参与者的点击来绘制热图。有两个身体有增加和减少的情绪。
我想用蓝色显示左侧身体的咔嗒声强度(更强烈的蓝色=更多点击次数)和右侧身体用红色显示。
问题是我需要在一个身体中显示它,并且还需要在背景图像上显示热图。
x=blue[:,1]
y=blue[:,2]
ax = plt.gca()
heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.imshow(heatmap.T, extent=extent, origin='lower')
ax = plt.gca()
ax.invert_yaxis()
plt.show()
x1=red[:,1]
y1=red[:,2]
ax = plt.gca()
heatmap, xedges, yedges = np.histogram2d(x1, y1, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.clf()
plt.imshow(heatmap.T, extent=extent, origin='lower')
ax = plt.gca()
ax.invert_yaxis()
plt.show()
plt.imshow(image)
imageFile = cbook.get_sample_data('C:\\Users\\Admin\\Desktop\\pythonpca\\result.png')
image = plt.imread(imageFile)
plt.plot(all_samples[0:240,0],all_samples[0:240,1], 'o', markersize=3, color='blue', alpha=0.5, label='increase')
plt.imshow(image)
通过这个,我获得左侧身体点击的热图,右侧身体点击的热图和左右身体的图片。我希望他们都在同一张图片中,有蓝色和红色的热点。我附上了我得到的照片。
2个尸体图片(我在其上绘制了蓝点,但我不需要这些点):
来自左右身体的热图:
如果我要添加更多信息,请告诉我。
答案 0 :(得分:2)
您可以使用两种不同的颜色来表示左侧和右侧的点击,并使用不透明度(Alpha通道)来表示给定区域内的点击密度。一种方法是创建一个在alpha通道中变化的自定义LinearSegmentedColormap
:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import colors
# Some fake data
nbins = (50, 50)
ranges = ((-2, 2), (-2, 2))
lx, ly = np.random.randn(2, 10000) * 0.5 + 1
rx, ry = np.random.randn(2, 10000) * 0.75 - 1
# Compute 2D histograms
left_density = np.histogram2d(lx, ly, bins=nbins, range=ranges, normed=True)[0]
right_density = np.histogram2d(rx, ry, bins=nbins, range=ranges, normed=True)[0]
# Make some custom colormaps that vary in the alpha channel.
trans2blue = colors.LinearSegmentedColormap.from_list(
name='Trans2Blue', colors=[(0., 0., 1., 0.), (0., 0., 1., 1.)])
trans2red = colors.LinearSegmentedColormap.from_list(
name='Trans2Red', colors=[(1., 0., 0., 0.), (1., 0., 0., 1.)])
# `imshow` the histograms using the custom colormaps.
fig, ax = plt.subplots(1, 1)
left_im = ax.imshow(left_density, cmap=trans2blue)
right_im = ax.imshow(right_density, cmap=trans2red)
right_cb = fig.colorbar(right_im)
right_cb.set_label('Right click density')
left_cb = fig.colorbar(left_im)
left_cb.set_label('Left click density')
# Workaround for https://stackoverflow.com/q/15003353/1461210
left_cb.solids.set_edgecolor("face")
right_cb.solids.set_edgecolor("face")
fig.tight_layout()
实现相同效果的另一种方法是构建两个(rows, cols, 4)
RGBA像素值数组,其中alpha通道包含您的密度值,RGB包含您想要的颜色,然后imshow
这些在顶部彼此使用自定义色彩映射虽然有一些优点 - 色彩映射范围会自动缩放,并且添加色条非常容易。