简介
Matplotlib 是一个用于在 Python 中创建可视化的强大库。有时,在创建图表时,你可能需要手动调整子图参数。本实验将向你展示如何根据标签的大小以编程方式调整子图参数。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入必要的库
我们将需要 matplotlib.pyplot 和 matplotlib.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 函数。