【问题标题】:Wrong colorbar positioning when using subplots (matplotlib)使用子图(matplotlib)时颜色条定位错误
【发布时间】:2014-06-02 09:48:30
【问题描述】:

我想创建一个由九个子图组成的图形。我真的很讨厌我需要分别创建 ax1 到 ax9,所以我创建了一个 for 循环来这样做。但是,当我想包含一个颜色条时,颜色条位于最后一个子图的右侧。下图也说明了这一点:

出了什么问题,我该如何解决?

已使用以下代码生成图像:

import numpy
import layout
import matplotlib.pylab as plt

data = numpy.random.random((10, 10))

test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"]

fig = plt.figure(1)

for idx in range(len(test)):
    vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1))

im = ax1.imshow(data)
plt.colorbar(im)

im2 = ax3.imshow(data)
plt.colorbar(im2)

plt.show()

【问题讨论】:

    标签: python matplotlib plot subplot colorbar


    【解决方案1】:

    老兄的回答很好。但是,我宁愿避免使用此方法进行复制粘贴:

    import numpy
    import matplotlib.pylab as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    data = numpy.random.random((10, 10))
    
    test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"]
    
    fig = plt.figure(1)
    
    for idx in range(len(test)):
      vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1))
      divider = make_axes_locatable(vars()[test[idx]])
      vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05)
    
      vars()["im" + str(idx)] = vars()[test[idx]].imshow(data)
      plt.colorbar(vars()["im" + str(idx)], cax = vars()["c" + test[idx]])
    
    plt.show()
    

    结果是一样的。

    【讨论】:

    • 也可以自定义地块的数量,只需为给定的地块数量创建一个测试列表。
    【解决方案2】:

    我找到了问题的答案,得到了正确的颜色条与子图间距。请注意,如果 subplot 和 colorbar 之间的间距无关紧要,则 Molly 的答案是正确的。

    import numpy
    import layout
    import matplotlib.pylab as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    data = numpy.random.random((10, 10))
    
    test = ["ax1", "ax2", "ax3", "ax4", "ax5", "ax6", "ax7", "ax8", "ax9"]
    
    fig = plt.figure(1)
    
    for idx in range(len(test)):
      vars()[test[idx]] = fig.add_subplot(3, 3, (idx + 1))
      divider = make_axes_locatable(vars()[test[idx]])
      vars()["c" + test[idx]] = divider.append_axes("right", size = "5%", pad = 0.05)
    
    
    im1 = ax1.imshow(data)
    plt.colorbar(im1, cax = cax1)
    
    im2 = ax2.imshow(data)
    plt.colorbar(im2, cax = cax2)
    
    im3 = ax3.imshow(data)
    plt.colorbar(im3, cax = cax3)
    
    im4 = ax4.imshow(data)
    plt.colorbar(im4, cax = cax4)
    
    im5 = ax5.imshow(data)
    plt.colorbar(im5, cax = cax5)
    
    im6 = ax6.imshow(data)
    plt.colorbar(im6, cax = cax6)
    
    im7 = ax7.imshow(data)
    plt.colorbar(im7, cax = cax7)
    
    im8 = ax8.imshow(data)
    plt.colorbar(im8, cax = cax8)
    
    im9 = ax9.imshow(data)
    plt.colorbar(im9, cax = cax9)
    
    plt.show()
    

    这会导致:

    【讨论】:

      【解决方案3】:

      colorbar 接受一个参数ax“父坐标区对象,新颜色条坐标区的空间将从该对象中被窃取”。在您的代码中,您可以执行以下操作以在轴旁边添加一个颜色条:

      im = ax1.imshow(data)
      plt.colorbar(im, ax = ax1)
      

      【讨论】:

      • 这比我找到的解决方案优雅一点。但是,子图和颜色条之间的间距相当大。有什么想法吗?
      • 试试 plt.tight_layout()
      猜你喜欢
      • 2023-03-13
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多