如何调整subplot中单张子图的长度,使带colorbar的子图与其他子图尺寸一致
如何调整subplot中单张子图的长度?
问题原因
出现第三张子图更短的问题,是因为直接在子图上调用plt.colorbar时,matplotlib会自动压缩该子图的空间来放置colorbar,而前两行子图没有被压缩,自然尺寸不一致。你原本的代码中用plt.subplots(3, 2)生成了3行2列共6个axes对象,前两行的第二列axes被闲置,也导致布局逻辑和预期不符。
解决方法
通过预定义网格布局,给colorbar单独留出专属位置,就不会占用语谱图的空间,三个子图的尺寸会自动对齐。示例代码如下:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import numpy as np # 创建画布,开启constrained_layout自动调整间距,避免元素重叠 fig = plt.figure(constrained_layout=True) # 定义3行2列网格,设置宽度比例让colorbar更窄,可按需调整 gs = GridSpec(3, 2, figure=fig, width_ratios=[9, 1]) # 前两个子图跨两列显示 ax1 = fig.add_subplot(gs[0, :]) ax2 = fig.add_subplot(gs[1, :]) # 第三行第一列放置语谱图 ax3 = fig.add_subplot(gs[2, 0]) # 第三行第二列预留给colorbar cbar_ax = fig.add_subplot(gs[2, 1]) # 原有绘图逻辑不变 ax1.plot(sb['Seconds'], sb['Real'], 'dodgerblue', linewidth = 0.5) ax2.plot(f2, np.log(P3), 'k', linewidth = 0.5) s, freqs, bins, im = ax3.specgram(y, NFFT = N, Fs=Fs1, cmap='jet') # 将colorbar绘制到预留的轴上,不会压缩语谱图 fig.colorbar(im, cax=cbar_ax, orientation='vertical', pad=0.009)
如果你使用的是matplotlib 3.4及以上版本,还可以用更简洁的subplot_mosaic实现相同效果:
import matplotlib.pyplot as plt import numpy as np fig, axs = plt.subplot_mosaic( [ ["ax1", "ax1"], ["ax2", "ax2"], ["ax3", "cbar"] ], width_ratios=[9, 1], constrained_layout=True ) # 取到对应axes后绘图逻辑和上述一致 ax1 = axs["ax1"] ax2 = axs["ax2"] ax3 = axs["ax3"] cbar_ax = axs["cbar"]
内容的提问来源于stack exchange,提问作者soobinism
相关产品推荐
相关产品推荐

