如何增加matplotlib图表底部空间且保持y轴范围0.0-1.0不变
matplotlib绘图底部边距不足问题解决
问题场景
我正在使用以下命令在matplotlib中创建绘图:
import matplotlib.pyplot as plt from matplotlib import cm import matplotlib.ticker import numpy as np # 此处省略dop、xdata、ydata的前置定义 fig = plt.figure() ax = plt.axes() ax.plot(xdata, ydata) my_cmap = cm.seismic ax.tick_params(axis='x', labelsize=16) ax.tick_params(axis='y', labelsize=16) sm = plt.cm.ScalarMappable(cmap=my_cmap, norm=plt.Normalize(vmin=0, vmax=1)) cbar = plt.colorbar(sm, orientation='vertical') cbar.set_ticks([0, 1]) cbar.set_ticklabels(["Poorest", "Best"]) cbar.ax.tick_params(labelsize=14) cbar.ax.set_ylabel("Quality of solvent", fontsize=18, rotation=270) ax.set_xscale('log') ax.set_xlabel("Temperature (reduced)", fontsize=18) ax.set_ylabel("$\\xi$", fontsize=18) ax.yaxis.set_major_locator(matplotlib.ticker.MaxNLocator(11)) ax.set_yticks(np.linspace(0, 1, 11)) fig.tight_layout() plt.savefig("DOP_"+str(dop)+"_parameter.png", dpi=1000)
生成的图像如下:
有参考方法建议使用plt.tight_layout()扩展图表底部边距,但实际使用后没有生效。需要在保持y轴取值范围0.0到1.0完全不变的前提下,给绘图底部增加额外的显示空间。
可行解决方案
tight_layout()的默认逻辑是自动压缩边距到刚好容纳所有轴标签、刻度元素,不会主动预留富余空间,而且自动计算偶尔会出现适配偏差。要实现需求不需要修改坐标轴数据范围,直接调整画布布局参数即可,以下两种常用方法都不会改动y轴0-1的显示区间:
- 方法1:用
subplots_adjust手动指定底部边距,兼容性最好,所有matplotlib版本都能用
把原代码里的fig.tight_layout()替换为如下代码:# 先执行自动布局适配基础元素 fig.tight_layout() # 单独调整底部边距,数值为相对figure的比例(0为画布最底部,1为画布最顶部) # 默认底部边距约为0.11,可按需调大到0.16~0.2之间,直到x轴标签完整显示 fig.subplots_adjust(bottom=0.18) - 方法2:用约束布局替代tight_layout,适配逻辑更智能(适合matplotlib 3.4及以上版本)
初始化画布时就指定使用constrained布局,后续通过布局引擎参数预留底部空间:# 初始化时替换原fig = plt.figure() fig = plt.figure(layout='constrained') # 后续绘图代码保持不变,在savefig前加一行调整布局边界 # rect参数格式为[left, bottom, right, top],所有值为相对画布的比例 # 把bottom值设为0.05~0.1之间即可留出足够底部空间 fig.get_layout_engine().set(rect=[0, 0.08, 1, 1])
注意:不要通过修改
ax.set_ylim()的方式留空间,会直接改变y轴的显示范围,不符合需求。上面两种方法都是调整绘图区域在画布上的位置,完全不会影响坐标轴本身的取值范围和刻度显示。
内容的提问来源于stack exchange,提问作者bad_chemist
相关产品推荐
相关产品推荐

