matplotlib子图的安排

时间:2018-06-07 10:06:10

标签: python-2.7 matplotlib

我在调整子图之间的间距方面存在一些问题。虽然关于类似问题有很多问题,但我找不到合适的解决方案。

这是一个简单的例子,其中包含一个随机值图和两个带有颜色条的图像:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, (ax1, ax2, ax3) = plt.subplots(figsize=(5, 8), nrows=3, ncols=1)

ax1.plot(np.random.rand(100))
ax1.set_ylabel('y-label')
ax1.set_xlabel('x-label')

im2 = ax2.imshow(np.random.random(size=(50, 100)))
ax2.axes.get_xaxis().set_ticks([])
ax2.axes.get_yaxis().set_ticks([])
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", "5%", pad="3%")
cbar2 = plt.colorbar(im2, cax=cax2, orientation='vertical')

im3 = ax3.imshow(np.random.random(size=(50, 100)))
ax3.axes.get_xaxis().set_ticks([])
ax3.axes.get_yaxis().set_ticks([])
divider3 = make_axes_locatable(ax3)
cax3 = divider3.append_axes("right", "5%", pad="3%")
cbar3 = plt.colorbar(im3, cax=cax3, orientation='vertical')

plt.tight_layout()

enter image description here

我怎么能:

  • 缩小两个下方图像之间的间距,类似于绘图与第一张图像之间的距离?
  • 将两个图像向左移动,使它们与图的y标签对齐?

1 个答案:

答案 0 :(得分:2)

您可以使用gridspec布局来放置子图。然后,棘手的一点是使参数正确。这需要进行一些测试。

这里的想法是创建一个包含4行和2列的gridspec。较低的两个子图将跨越两列,而上部子图仅跨越两列。还会有一个空行来说明上图的x标签所需的额外空间。

enter image description here

当然你不应该调用tight_layout因为那会再次扰乱所有设置良好的参数。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.gridspec import GridSpec

fig = plt.figure(figsize=(5, 8))

gs = GridSpec(nrows=4, ncols=2,height_ratios=[1.2, .1, .8, .8],
                               width_ratios=[.1, 1], 
                               hspace=0.05, wspace=0.1,
                               left=0.05, right=0.9, 
                               bottom=0.02, top=0.98)

ax1=fig.add_subplot(gs[0,1])
ax2=fig.add_subplot(gs[2,:])
ax3=fig.add_subplot(gs[3,:])

ax1.plot(np.random.rand(100))
ax1.set_ylabel('y-label')
ax1.set_xlabel('x-label')

im2 = ax2.imshow(np.random.random(size=(50, 100)))
ax2.axes.get_xaxis().set_ticks([])
ax2.axes.get_yaxis().set_ticks([])
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", "5%", pad="3%")
cbar2 = plt.colorbar(im2, cax=cax2, orientation='vertical')

im3 = ax3.imshow(np.random.random(size=(50, 100)))
ax3.axes.get_xaxis().set_ticks([])
ax3.axes.get_yaxis().set_ticks([])
divider3 = make_axes_locatable(ax3)
cax3 = divider3.append_axes("right", "5%", pad="3%")
cbar3 = plt.colorbar(im3, cax=cax3, orientation='vertical')


plt.show()

enter image description here