【问题标题】:Imshow subplots with the same colorbar显示具有相同颜色条的子图
【发布时间】:2013-08-01 09:18:02
【问题描述】:

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

【问题讨论】:

标签: python matplotlib


【解决方案1】:

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

例如,如果您要显示的值的范围是 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()

【讨论】:

  • 不是很漂亮,因为第二个轴更窄,请参阅stackoverflow.com/questions/13784201/…
  • @RuggeroTurra 是的,但那是因为 aspect='auto' 并且在任何情况下都可以通过更改子图空间(或例如 gridspec)来调整。在您链接的公认答案中,颜色栏也没有轴高,因此仍然需要进行一些调整。
【解决方案2】:

当数据集(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)

【讨论】:

    【解决方案3】:

    您可能事先不知道数据的范围,但您可能知道它们在某种程度上是兼容的。在这种情况下,您可能更愿意让 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-02-02
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多