Python 使用子图(matplotlib)时颜色栏的定位错误

Python 使用子图(matplotlib)时颜色栏的定位错误,python,matplotlib,plot,subplot,colorbar,Python,Matplotlib,Plot,Subplot,Colorbar,我想创建一个由九个子地块组成的图形。我真的很讨厌我需要单独创建ax1到ax9,所以我创建了一个for循环来实现这一点。但是,当我想要包含一个颜色条时,颜色条位于最后一个子批次的右侧。下图也说明了这一点: 出了什么问题,我该如何解决 已使用以下代码生成图像: import numpy import layout import matplotlib.pylab as plt data = numpy.random.random((10, 10)) test = ["ax1", "ax2", "

我想创建一个由九个子地块组成的图形。我真的很讨厌我需要单独创建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()

我找到了我问题的答案,得到了正确的色条与子地块间距。请注意,如果子图和颜色条之间的间距无关紧要,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()
这导致:

接受一个参数
ax
即“父轴对象,新色条轴的空间将从该对象中被窃取”。在代码中,您可以这样做,在色条轴旁边添加一个色条:

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

杜德的回答很好。但是,我希望使用以下方法避免复制粘贴:

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()

结果是一样的。

这比我找到的解决方案要优雅一点。但是,子地块和颜色栏之间的间距相当大。有什么想法吗?试试plt.tight_layout()。也可以通过为给定数量的绘图创建一个测试列表来定制绘图数量。