通过编程控制子图调整

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Matplotlib 是一个用于在 Python 中创建可视化的强大库。有时,在创建图表时,你可能需要手动调整子图参数。本实验将向你展示如何根据标签的大小以编程方式调整子图参数。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

我们将需要 matplotlib.pyplotmatplotlib.transforms 来创建图表并操作子图参数。

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

创建图表

让我们创建一个带有一些较长 y 轴标签的简单折线图。

fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_yticks([2, 5, 7], labels=['really, really, really', 'long', 'labels'])

定义绘制回调函数

我们将定义一个函数,每次绘制图表时都会调用该函数。此函数将计算 y 轴标签的边界框,确定子图是否为标签留出了足够的空间,并在必要时调整子图参数。

def on_draw(event):
    bboxes = []
    for label in ax.get_yticklabels():
        ## 以像素为单位的边界框
        bbox_px = label.get_window_extent()
        ## 转换为相对图形坐标。这是 transFigure 的逆变换。
        bbox_fig = bbox_px.transformed(fig.transFigure.inverted())
        bboxes.append(bbox_fig)
    ## 再次以相对图形坐标表示的包围所有边界框的边界框
    bbox = mtransforms.Bbox.union(bboxes)
    if fig.subplotpars.left < bbox.width:
        ## 将子图左边缘向右移动更多
        fig.subplots_adjust(left=1.1*bbox.width)  ## 稍微填充一点
        fig.canvas.draw()

将绘制事件连接到回调函数

我们需要将 draw_event 连接到我们的 on_draw 函数。

fig.canvas.mpl_connect('draw_event', on_draw)

显示图表

最后,我们将显示该图表。

plt.show()

总结

在本实验中,我们学习了如何根据标签的大小以编程方式调整子图参数。我们使用 matplotlib.transforms 模块来计算标签的边界框,并使用 draw_event 来调用我们的 on_draw 函数。