lov*_*eed 27 python matplotlib
我想制作4 imshow个子图,但它们都共享相同的颜色图.Matplotlib根据矩阵的条目自动调整色彩图上的比例.例如,如果我的一个矩阵的所有条目都为10而另一个条目的所有条目都等于5并且我使用了Greys色彩映射,那么我的一个子图应该是完全黑色而另一个应该是完全灰色的.但他们两个最终都变成了黑色.如何使所有子图在色图上共享相同的比例?
tia*_*ago 40
要做到这一点,你需要让所有图像具有相同的强度标度,否则colorbar()颜色是没有意义的.要做到这一点,请使用vmin和的vmax参数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()
Run Code Online (Sandbox Code Playgroud)

当数据(数据 1 和数据 2)集的范围未知并且您想对两个/所有图使用相同的颜色条时,找到整体最小值和最大值以用作vmin和vmax在调用中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)
Run Code Online (Sandbox Code Playgroud)

可能您事先不知道数据的范围,但您可能知道它们以某种方式兼容。在这种情况下,您可能更愿意让 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()
Run Code Online (Sandbox Code Playgroud)