如何为一系列Python绘图创建标准色条
我在用matplotlib这个工具在Python里画图,想要在图上加一个标准的颜色条。我的数据是一些NxM的矩阵,里面包含了频率信息,所以用简单的imshow()函数画出来的图就像是一个二维的直方图,颜色表示频率。每个矩阵的数据范围不同,但有些地方是重叠的。imshow会把每个矩阵的数据标准化到0到1的范围,这就意味着,比如说矩阵A的图和矩阵2*A的图看起来是一样的,虽然颜色条上显示的值是前者的两倍。我希望,比如说红色能在所有图中对应相同的频率。换句话说,我希望所有图都能用一个颜色条就够了。如果有任何建议,我会非常感激。
4 个回答
2
这个回答只解决了问题的一部分,或者说是引出了一个新问题。
如果你把
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
改成
data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]
那么你的颜色条就会从0变到0.5,在这个情况下,颜色会从深蓝色变成稍微浅一点的蓝色,而不会覆盖整个范围(0到2)。
颜色条只会显示最后一幅图像或轮廓的颜色,而不管你设置的 vmin
和 vmax
是什么。
9
最简单的办法就是在每个图表中都用相同的参数调用clim(lower_limit, upper_limit)。
74
我不是想抢@ianilis的答案,但我想补充一个例子...
有很多方法可以做到这一点,但最简单的就是在imshow
函数里直接指定vmin
和vmax
这两个参数。你也可以创建一个matplotlib.cm.Colormap
的实例并指定它,不过对于简单的情况来说,这样做就有点复杂了。
下面是一个快速的例子,展示了如何为所有图像使用一个统一的颜色条:
import numpy as np
import matplotlib.pyplot as plt
# Generate some data that where each slice has a different range
# (The overall range is from 0 to 2)
data = np.random.random((4,10,10))
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
# Plot each slice as an independent subplot
fig, axes = plt.subplots(nrows=2, ncols=2)
for dat, ax in zip(data, axes.flat):
# The vmin and vmax arguments specify the color limits
im = ax.imshow(dat, vmin=0, vmax=2)
# Make an axis for the colorbar on the right side
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
fig.colorbar(im, cax=cax)
plt.show()