当使用子图(matplotlib)时,颜色条位置错误。

8
我想创建一个由九个子图组成的图。 我非常讨厌需要分别创建ax1到ax9,因此我创建了一个for循环来完成这项工作。 但是,当我想包括一个颜色条时,颜色条位于最后一个子图的右侧。 这也在下图中说明了: enter image description here 出了什么问题?如何解决?
以下代码生成了该图像:
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()
3个回答

11

colorbar 函数需要一个参数 ax,它表示 "从中窃取空间以创建新的颜色条轴的父轴对象"。在你的代码中,你可以像这样添加一个颜色条到一个轴旁边:

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

这个解决方案比我找到的要更优雅一些。但是子图和色条之间的间距相当大。有什么想法吗? - The Dude
尝试使用plt.tight_layout()。 - Molly

3
我找到了问题的答案,解决了正确的颜色条与子图间距的问题。请注意,如果子图和颜色条之间的间距不重要,则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()

这导致了如下结果:

在此输入图片描述


0
哥们的回答很好。不过我更喜欢使用这种方式避免复制粘贴:
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()

结果是相同的。

同时,通过为给定数量的图表创建一个测试列表,可以轻松地自定义生成图表的数量。 - mibrl12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接