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

Posted

技术标签:

【中文标题】如何为python中的一系列图创建标准颜色条【英文标题】:How can I create a standard colorbar for a series of plots in python 【发布时间】:2011-12-14 02:40:17 【问题描述】:

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

【问题讨论】:

我更喜欢使用 matshow() 或 pcolor() 因为 imshow() 在显示时会平滑矩阵,从而使解释变得更加困难。所以除非矩阵确实是图像,否则我建议你尝试其他两个。 @inalis - 如果您不想插值,可以在使用 imshow 时指定 interpolation='nearest'。对于大型数组,pcolorimshow 慢得多,因此对于大型数组,最好使用 imshow。另一方面,pcolor 提供矢量输出,有时非常方便。 Matplotlib 2 Subplots, 1 Colorbar 的可能重复项 【参考方案1】:

不是偷@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()

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

这只能回答一半的问题,或者更确切地说是开始一个新问题。 如果你改变了

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 是什么,颜色条都只会显示最后一张图像或轮廓的颜色。

【讨论】:

【参考方案4】:

我对建议手动设置vminvmax 的解决方案不满意,因此我决定阅读每个绘图的限制并自动设置vminvmax

下面的示例显示了取自均值增加的正态分布的三个样本图。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np

numberOfPlots = 3
data = []
for i in range(numberOfPlots):
    mean = i
    data.append(np.random.normal(mean, size=(100,100)))

fig = plt.figure()
grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode='single')
ims = []
for i in range(numberOfPlots):
    ims.append(grid[i].imshow(data[i]))
    grid[i].set_title("Mean = " + str(i))

clims = [im.get_clim() for im in ims]
vmin = min([clim[0] for clim in clims])
vmax = max([clim[1] for clim in clims])
for im in ims:
    im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax))
grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical    

fig.show()

【讨论】:

以上是关于如何为python中的一系列图创建标准颜色条的主要内容,如果未能解决你的问题,请参考以下文章

如何为地理视图(散景)创建自定义颜色图?

译如何为团队定义CSS标准

如何为所有子图设置一个颜色条

如何为列中的每个唯一值获取数据框中的项目数[重复]

如何为数据系列中的数据范围命名?

如何为使用 python 保存的 tiff 图像设置像素大小,以便将像素高度和宽度设置为 ImageJ 中的特定值?