当前位置: 首页 > news >正文

Matplotlib实现Label及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, transform=subfig.transAxes)
plt.xlable("(a) ...", lablepad = 8, fontsize = 8)

可是这种方法需要不断调整plt.text传入的参数,使得textxticksxlable中间(不然很丑),非常之麻烦。

2. 基本思想(可以不看)

可以计算xlabel的上坐标以及xticks的下坐标,然后就可自动计算二者中心坐标,就可以自动居中绘制text了。

3. 方法封装

首先封装一个方法,其中exp代表xticks的解释(例如:duplication ratio (%)),title通过xlable展示出来

def add_explanation_and_title(fig, ax: Axes, exp, title, title_pad=10, title_fontsize=8, exp_fontsize=6):lable_pad = title_padax.set_xlabel(title, fontsize=title_fontsize, labelpad=lable_pad) return [exp, title, title_pad, title_fontsize, exp_fontsize]

接着写一个关键函数用来计算xlablexticks的距离,获取相应距离的函数主要通过get_window_extent()方法获取

def adjust_explanation(fig, axes, context):exp, title, title_pad, title_fontsize, exp_fontsize = contextfig.savefig("./temp.pdf", bbox_inches='tight', pad_inches=0)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, ha='center', fontsize=exp_fontsize, transform=ax.transAxes)   

在上述代码中,fig.savefig非常重要,这是对当前画布做渲染绘制,得到相应的rendererrenderer用于为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,到这里就可以起飞了🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫🛫

相关文章:

  • NX二次开发UF_CAM_ask_post_template_name 函数介绍
  • 命令执行无回显的判断方法及dnslog相关例题的讲解
  • 【金融分析】Python:病人预约安排政策 | 金融模拟分析
  • 3.8-镜像的发布
  • Java 12 及Tomcat 部署配置
  • BUUCTF [BJDCTF2020]一叶障目 1
  • vscode设置前进、后退快捷键
  • CISP模拟试题(一)
  • 鸿蒙APP外包开发上线流程
  • GaussDB新特性Ustore存储引擎介绍
  • BUUCTF 菜刀666 1
  • Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefilemake详解
  • 【Python】 Python 操作PDF文档
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • 应用软件安全编程--24不要使用硬编码密匙
  • 自己简单写的 事件订阅机制
  • 77. Combinations
  • Android框架之Volley
  • Babel配置的不完全指南
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • log4j2输出到kafka
  • vue 配置sass、scss全局变量
  • Xmanager 远程桌面 CentOS 7
  • yii2中session跨域名的问题
  • 阿里云购买磁盘后挂载
  • 安卓应用性能调试和优化经验分享
  • 测试开发系类之接口自动化测试
  • 关于springcloud Gateway中的限流
  • 警报:线上事故之CountDownLatch的威力
  • 目录与文件属性:编写ls
  • 数据结构java版之冒泡排序及优化
  • 为视图添加丝滑的水波纹
  • 小程序button引导用户授权
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • "无招胜有招"nbsp;史上最全的互…
  • (C++17) std算法之执行策略 execution
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (SpringBoot)第二章:Spring创建和使用
  • (待修改)PyG安装步骤
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET NPOI导出Excel详解
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 设置默认首页
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net6+aspose.words导出word并转pdf
  • .NetCore 如何动态路由