如何在python中为一系列图创建标准颜色条

时间:2011-10-24 12:34:40

标签: python matplotlib colorbar

我使用matplotlib在python中绘制一些数据,并且图表需要标准颜色条。数据由一系列包含频率信息的NxM矩阵组成,因此简单的imshow()图给出了描述频率的颜色的2D直方图。每个矩阵包含不同但重叠范围的数据。 Imshow将每个矩阵中的数据归一化到范围0-1,这意味着,例如,矩阵A的图将看起来与矩阵2 * A的图相同(尽管颜色条将显示两倍的值)。我想要的是红色,例如,对应于所有图中的相同频率。换句话说,单个彩条就足以满足所有情节。任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:73)

不要窃取@ ianilis的答案,但我想添加一个例子......

有多种方法,但最简单的方法是将vminvmax kwargs指定为imshow。或者,您可以创建一个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()

enter image description here

答案 1 :(得分:9)

最简单的解决方案是使用每个绘图的相同参数调用clim(lower_limit,upper_limit)。

答案 2 :(得分: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)。 无论vminvmax如何,颜色条都只显示最后一幅图像或轮廓的颜色。

答案 3 :(得分:0)

我对建议手动设置vminvmax的解决方案感到不满意,所以我决定阅读每个情节的限制并自动设置vmin和{ {1}}。

以下示例显示了取自正态分布的三个样本,其平均值增加。

vmax

enter image description here