我希望制作4个imshow
子图,它们都共享相同的颜色映射。Matplotlib自动调整颜色映射的比例取决于矩阵的条目。例如,如果我的某个矩阵所有条目都为10,另一个矩阵所有条目都为5,并且我使用Greys
颜色映射,则我的其中一个子图应该完全是黑色的,而另一个则应该完全是灰色的。但两个子图最终都变成了完全黑色。如何使所有子图共享颜色映射上的相同比例?
我希望制作4个imshow
子图,它们都共享相同的颜色映射。Matplotlib自动调整颜色映射的比例取决于矩阵的条目。例如,如果我的某个矩阵所有条目都为10,另一个矩阵所有条目都为5,并且我使用Greys
颜色映射,则我的其中一个子图应该完全是黑色的,而另一个则应该完全是灰色的。但两个子图最终都变成了完全黑色。如何使所有子图共享颜色映射上的相同比例?
colorbar()
的颜色就毫无意义了。为此,请使用 imshow()
的 vmin
和 vmax
参数,并确保它们对于所有图像都是相同的。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
plt.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()
aspect='auto'
,而且在任何情况下都可以通过更改子图空间(或例如网格规范)进行调整。在您链接的被接受的答案中,色条也不像轴那样高,因此仍然需要进行一些调整。 - tiago当数据范围(数据1和数据2)未知,并且希望为所有绘图使用相同的色彩条时,请查找整体最小值和最大值,用作在调用imshow
时的vmin
和vmax
:
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)
也许你事先不知道数据的范围,但你可能知道它们在某种程度上是兼容的。在这种情况下,您可能更喜欢让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()