python中的热图 - 颜色

时间:2017-08-15 17:16:24

标签: python matplotlib heatmap

我尝试制作一个程序,根据参与者的点击来绘制热图。有两个身体有增加和减少的情绪。

我想用蓝色显示左侧身体的咔嗒声强度(更强烈的蓝色=更多点击次数)和右侧身体用红色显示。

问题是我需要在一个身体中显示它,并且还需要在背景图像上显示热图。

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个尸体图片(我在其上绘制了蓝点,但我不需要这些点):

2 bodies picture ( I have plotted blue points on it, but I do not need the points

来自左右身体的热图:

the heat maps from the left and right bodies

如果我要添加更多信息,请告诉我。

1 个答案:

答案 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()

enter image description here

实现相同效果的另一种方法是构建两个(rows, cols, 4) RGBA像素值数组,其中alpha通道包含您的密度值,RGB包含您想要的颜色,然后imshow这些在顶部彼此使用自定义色彩映射虽然有一些优点 - 色彩映射范围会自动缩放,并且添加色条非常容易。