我使用matplotlib在python中绘制一些数据,并且图表需要标准颜色条。数据由一系列包含频率信息的NxM矩阵组成,因此简单的imshow()图给出了描述频率的颜色的2D直方图。每个矩阵包含不同但重叠范围的数据。 Imshow将每个矩阵中的数据归一化到范围0-1,这意味着,例如,矩阵A的图将看起来与矩阵2 * A的图相同(尽管颜色条将显示两倍的值)。我想要的是红色,例如,对应于所有图中的相同频率。换句话说,单个彩条就足以满足所有情节。任何建议都将不胜感激。
答案 0 :(得分:73)
不要窃取@ ianilis的答案,但我想添加一个例子......
有多种方法,但最简单的方法是将vmin
和vmax
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()
答案 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)。
无论vmin
和vmax
如何,颜色条都只显示最后一幅图像或轮廓的颜色。
答案 3 :(得分:0)