热力图
热力图(Heat Map)是指用 X 轴 和 Y 轴 表示的两个分类字段确定数值点的位置,通过相应位置的矩形颜色去表现数值的大小,颜色深代表的数值大。
热力图是非常特殊的一种图,可以显示不可点击区域发生的事情。热力图非常关注分布,可以不需要坐标轴,其背景通常是图片或者地图,一般使用彩虹色系做展示。
热力图一般以二维居多,多用于图像处理领域。
热力图主要用于展示连续型数据的分布情况。例如用颜色展现某一范围内不同地区数据量的差异,网站分析等等。
优势:好看、易于理解,数据信息更直观有效,可以清晰地呈现数据在地理空间的分布、频率或密度情况。
缺点:效果过于柔化,不适合用作数据的精确表达,且不适合比较单一变量的大小。
一维热力图-----总体分布情况
根据折线图中的数据创建一维热图,类似于直方图,根据每个 bins 的出现频率绘制不同颜色
代码
可以通过imshow关键字参数设置imshow设置图像的数据范围。 这用元组(left, right, bottom, top)设置范围。
在范围内使用直方图的最小和最大bin边缘可将数据移动到其原始值
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
# 画布大小
plt.rcParams["figure.figsize"] = 5,2
# 顺序生成 -56 到 40 之间的96个数
pos = np.arange(-56,40) #there are 96 numbers from -56 to 39
print len(pos), pos.min(), pos.max()
# 生成 96 个随机数
p = np.random.rand(len(pos))
# 随机数转化成概率
p= p/np.sum(p)
# 根据每个数出现的概率,在 pos 中挑选 4000 个数
a= np.random.choice(pos, size=4000, p=p)
# 将 a 的取值范围划分为 96 个 bin
bins=np.arange(-56,41)
# 得到直方分布,hist 表示每个 bin 中数的个数 ,edges 表示 bin 的边界
hist, edges = np.histogram(a, bins)
hist=hist[np.newaxis,:]
# 热力图 x轴 和 y轴范围
extent=[bins.min(), bins.max(),0,1]
#画图
plt.imshow(hist, aspect ="auto", cmap="viridis", extent=extent)
plt.gca().set_yticks([])
plt.show()
一维热力图----数据变化情况
根据数据本身的波动情况,根据数值本身大小变换颜色
例图,可以看到数值大时,热力图更红,数值小时,热力图更蓝
代码
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
# 画布大小
plt.rcParams["figure.figsize"] = 5,4
# 生成 40 个 sin 函数值
x = np.sin(range(40))
# 每x个数计算平均值,即一段内的分布(此处取为1,即为每个数绘制分布)
a = x.reshape(1,-1)
a = np.mean(a, axis=0)
a=a[np.newaxis,:]
# 绘制热力图
figure = plt.figure()
axes = figure.add_subplot(211)
axes.matshow(a,aspect ="auto",cmap="Spectral_r", interpolation='bilinear')
# 不显示横纵坐标
plt.xticks([])
plt.yticks([])
# 绘制原始数据图
plt.subplot(212)
plt.plot(range(len(x)),x)
# x轴显示范围从第一个数到最后一个
plt.xlim((0,len(x)-1))
plt.show()
attention 热力图绘制原理
难点在于数据获取,获取最后一层梯度数据,即可知道注意力重点,根据梯度数据 resize 到原始数据,再画出热力图(根据数据变化情况),之后与原始数据对应,即可得到网络的高响应热力图