43

我想制作 4imshow个子图,但它们都共享相同的颜色图。Matplotlib 根据矩阵的条目自动调整颜色图上的比例。例如,如果我的一个矩阵的所有整数都为 10,而另一个矩阵的所有条目都等于 5,并且我使用Greys颜色图,那么我的一个子图应该是完全黑色的,而另一个应该是完全灰色的。但他们两个最终都变得完全黑了。如何使所有子图在颜色图上共享相同的比例?

4

3 回答 3

64

要做到这一点,您需要使所有图像具有相同的强度等级,否则colorbar()颜色将毫无意义。为此,请使用 的vminvmax参数imshow(),并确保它们对于所有图像都相同。

例如,如果您要显示的值范围从 0 到 10,则可以使用以下内容:

import pylab as plt
import numpy as np
my_image1 = np.linspace(0, 10, 10000).reshape(100,100)
my_image2 = np.sqrt(my_image1.T) + 3
subplot(1, 2, 1)
plt.imshow(my_image1, vmin=0, vmax=10, cmap='jet', aspect='auto')
plt.subplot(1, 2, 2)
plt.imshow(my_image2, vmin=0, vmax=10, cmap='jet', aspect='auto')
plt.colorbar()

在此处输入图像描述

于 2013-08-01T13:14:59.547 回答
10

当数据集(data1 和 data2)的范围未知并且您想对两个/所有图使用相同的颜色条时,找到总体最小值和最大值以用作vminvmax调用imshow

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=2)

# generate randomly populated arrays
data1 = np.random.rand(10,10)*10 
data2 = np.random.rand(10,10)*10 -7.5

# find minimum of minima & maximum of maxima
minmin = np.min([np.min(data1), np.min(data2)])
maxmax = np.max([np.max(data1), np.max(data2)])

im1 = axes[0].imshow(data1, vmin=minmin, vmax=maxmax,
                     extent=(-5,5,-5,5), aspect='auto', cmap='viridis')
im2 = axes[1].imshow(data2, vmin=minmin, vmax=maxmax,
                     extent=(-5,5,-5,5), aspect='auto', cmap='viridis')

# add space for colour bar
fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.88, 0.15, 0.04, 0.7])
fig.colorbar(im2, cax=cbar_ax)

带有单色条的双 imshow 图

于 2020-12-21T12:33:22.103 回答
5

可能是您事先不知道数据的范围,但您可能知道它们以某种方式兼容。在这种情况下,您可能更愿意让 matplotlib 为第一个图选择这些范围,并为其余图使用相同的范围。这是你如何做到的。关键是要获得限制properties()['clim']

import numpy as np
import matplotlib.pyplot as plt

my_image1 = np.linspace(0, 10, 10000).reshape(100,100)
my_image2 = np.sqrt(my_image1.T) + 3

fig, axes = plt.subplots(nrows=1, ncols=2)
im = axes[0].imshow(my_image1)
clim=im.properties()['clim']
axes[1].imshow(my_image2, clim=clim)

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.5)

plt.show()
于 2017-03-03T11:03:29.677 回答