如何为一系列Python绘图创建标准色条

38 投票
4 回答
47813 浏览
提问于 2025-04-17 04:53

我在用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)。

颜色条只会显示最后一幅图像或轮廓的颜色,而不管你设置的 vminvmax 是什么。

9

最简单的办法就是在每个图表中都用相同的参数调用clim(lower_limit, upper_limit)。

74

我不是想抢@ianilis的答案,但我想补充一个例子...

有很多方法可以做到这一点,但最简单的就是在imshow函数里直接指定vminvmax这两个参数。你也可以创建一个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()

在这里输入图片描述

撰写回答