如何在matplotlib中轻松启用/禁用共享坐标轴

4 投票
3 回答
4713 浏览
提问于 2025-04-17 13:31

之前tcaswell的回答讲了如何为不在同一个图上的图表创建共享坐标轴,这个方法非常好 :) 但我现在想知道怎么才能禁用这些共享坐标轴,然后再重新启用它们,而不需要重新绘制或者销毁任何东西?(我有多个图表,想添加一个按钮,让用户可以点击来禁用/启用这些共享坐标轴)我找到了一种方法:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
fig2 = plt.figure()
ax2 = fig2.add_subplot(111, sharex=ax1)

先创建共享坐标轴,然后

fig2.delaxes(ax2)
ax2 = fig2.add_subplot(111)

但这样做需要重新绘制所有内容,可能会花费一些时间。我没有找到一个简单的函数来禁用这个链接。有没有比我做的更轻松的方法呢?

谢谢!

3 个回答

2

你可以改变一个叫做Grouper的对象,这个对象决定了哪些图表是共享坐标轴的。x轴的Grouper对象可以在 ax1._shared_x_axesax2._shared_x_axes 中找到,因为它们其实是同一个对象。

如果你想停止这两个图表共享x轴,可以使用 ax2._shared_x_axes.remove(ax2) 这个命令。

如果你想让它们再次共享,可以用 ax2._shared_x_axes.join(ax1, ax2)

如果你想更深入地了解,可以查看文档,链接在 这里ax1._shared_x_axes 是一个Grouper对象,其中ax1和ax2是共享的元素。

通过 ax2.get_shared_x_axes() 方法,你只能读取这个对象,而不能修改它。要进行修改,你需要直接访问这个对象,使用 ax2._shared_x_axes

13

你可以这样做:

ax2.get_shared_x_axes().remove(ax1)

参考资料:

4

目前没有简单的方法来实现这个功能,不过我觉得是可以做到的(只是需要深入了解一下 matplotlib 的内部结构)。其实,坐标轴之间的链接是通过使用相同的定位器和格式化器对象来实现的。要链接或解除链接,你需要复制或新建这些对象,同时还要更新一些辅助结构(比如 _shared_x_axes_shared_y_axes)。你可以看看 matplotlib.axes.Axes.cla() 的实现,了解一下你需要做什么。

在这个代码库里有一个 拉取请求,它增加了这个功能,还有相关的 功能请求。如果你对以下内容比较熟悉:a) 从源代码安装 b) 使用主分支 c) 应用这个补丁,我想开发者会很感激你来测试一下这个功能。

撰写回答