我在调整子图之间的间距方面存在一些问题。虽然关于类似问题有很多问题,但我找不到合适的解决方案。
这是一个简单的例子,其中包含一个随机值图和两个带有颜色条的图像:
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()
我怎么能:
答案 0 :(得分:2)
您可以使用gridspec布局来放置子图。然后,棘手的一点是使参数正确。这需要进行一些测试。
这里的想法是创建一个包含4行和2列的gridspec。较低的两个子图将跨越两列,而上部子图仅跨越两列。还会有一个空行来说明上图的x标签所需的额外空间。
当然你不应该调用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()