品牌电商网站设计,江苏省网架公司,上海建设学校网站,正规品牌网站设计品牌Matplotlib实现Label及Title都在下方的最佳姿势 1. 问题背景2. 基本思想#xff08;可以不看#xff09;3. 方法封装4. 调用实例5. 总结6. 起飞 1. 问题背景
用python绘制下面这种图的时候#xff0c;一般用xlable作为子图的标题#xff0c;这是因为plt.title()方法绘制的… Matplotlib实现Label及Title都在下方的最佳姿势 1. 问题背景2. 基本思想可以不看3. 方法封装4. 调用实例5. 总结6. 起飞 1. 问题背景
用python绘制下面这种图的时候一般用xlable作为子图的标题这是因为plt.title()方法绘制的标题在图的上方与latex默认子图的标题不同。那么在这种情况下duplication ratio (%)该如何显示呢 一个最简单的方案在上图中使用plt.text()绘制文字利用labelpad把xlable向下移动。
plt.text(0.5, -0.27, duplication ratio (%), ..., fontsize 6, transformsubfig.transAxes)
plt.xlable((a) ..., lablepad 8, fontsize 8)可是这种方法需要不断调整plt.text传入的参数使得text在xticks与xlable中间不然很丑非常之麻烦。
2. 基本思想可以不看
可以计算xlabel的上坐标以及xticks的下坐标然后就可自动计算二者中心坐标就可以自动居中绘制text了。
3. 方法封装
首先封装一个方法其中exp代表xticks的解释例如duplication ratio (%)title通过xlable展示出来
def add_explanation_and_title(fig, ax: Axes, exp, title, title_pad10, title_fontsize8, exp_fontsize6):lable_pad title_padax.set_xlabel(title, fontsizetitle_fontsize, labelpadlable_pad) return [exp, title, title_pad, title_fontsize, exp_fontsize]接着写一个关键函数用来计算xlable和xticks的距离获取相应距离的函数主要通过get_window_extent()方法获取
def adjust_explanation(fig, axes, context):exp, title, title_pad, title_fontsize, exp_fontsize contextfig.savefig(./temp.pdf, bbox_inchestight, pad_inches0)midpoint (0.5, 0.5)for idx, ax in enumerate(axes):xtick_label ax.get_xticklabels()[0]label_bbox1 xtick_label.get_window_extent()# print(label_bbox1)figure_pos1 label_bbox1.transformed(ax.transAxes.inverted())# Get the xlabel objectxlable ax.xaxis.labellabel_bbox2 xlable.get_window_extent()# print(label_bbox2)figure_pos2 label_bbox2.transformed(ax.transAxes.inverted())midpoint (0.5, (figure_pos1.y0 figure_pos2.y1) / 2 0.08)print(midpoint)for idx, ax in enumerate(axes):ax.text(midpoint[0], midpoint[1], exp, hacenter, fontsizeexp_fontsize, transformax.transAxes)
在上述代码中fig.savefig非常重要这是对当前画布做渲染绘制得到相应的renderer。renderer用于为get_window_extent()提供参考。 考虑这样一种情况我们会用plt.tight_layout()来紧缩画布此时调用savefig便可以拿到绘制紧缩画布的renderer 4. 调用实例
fig plt.figure(dpi 300, figsize (400, 500))
...
ax fig.gca()
...
context add_explanation_and_title(fig, ax, duplication ratio (%), (a) Single Thread xxx)
...
# context保存了相关信息用于后续adjust_explanation做参考
context add_explanation_and_title(fig, ax, duplication ratio (%), (b) Multi Thread xxx)
...
plt.tight_layout()
# 放在plt.tight_layout()后通过savefig获取画布renderer并
# 调整exp的最终坐标予以绘制
adjust_explanation(fig, fig.axes, context)
plt.savefig(xxx.pdf)5. 总结
其实很难想象Matplotlib一直没有一个类似的库来支持以上操作。现有的将title放到下面的方法只有类似如下方法
plt.title(Scatter plot pythonspot.com, y-0.01)但这种方法导致对坐标的解释文字无法很好适配。另一种方案即背景中的方案也需要繁琐的适配。本文给出了一种自动化方案希望能对科研作图有所帮助。
6. 起飞
OK到这里就可以起飞了