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

8 投票
3 回答
8603 浏览
提问于 2025-04-18 03:11

我想创建一个包含九个小图的图形。我真的很讨厌需要单独创建 ax1 到 ax9,所以我用了一个循环来一次性创建它们。不过,当我想加一个颜色条的时候,颜色条的位置是在最后一个小图的右边。下面的图也展示了这个问题:

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 个回答

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

结果是一样的。

11

colorbar 是一个函数,它需要一个参数 ax,这个参数代表“要从中挤出空间来放置新颜色条的父坐标轴对象”。在你的代码中,你可以这样做,把颜色条添加到坐标轴旁边:

im = ax1.imshow(data)
plt.colorbar(im, ax = ax1)
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()

这样就得到了:

在这里输入图片描述

撰写回答