如何使用matplotlib轻松启用/禁用共享轴

3

tcaswell先前在stackoverflow上的答案非常完美,讲述了如何创建不在同一图中的共享坐标轴 :) 但是我现在想知道如何禁用共享轴并重新启用它们而无需重绘或销毁任何内容?(我有多个图形,希望添加一个按钮,用户可以单击以禁用/启用这些共享轴)我找到了一种方法:

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)

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

谢谢!


将链接添加到当前(2018年2月)正在尝试实现此功能的WIP:https://github.com/matplotlib/matplotlib/pull/9923 - drammock
3个回答

12

1
此外,当使用sharex和/或sharey选项创建子图时,例如fig,axes = plt.subplots(nrows = 3,ncols = 3,sharex = True,sharey = True)ax2.get_shared_x_axes()包含所有轴的列表。因此,需要为每个轴执行ax12.get_shared_x_axes().remove(axis),或者更好的方法是[ax12.get_shared_x_axes().remove(axis) for axis in axes.ravel()]。我分享这个原因是因为我尝试了多次:ax12.get_shared_x_axes()实际上不是一个列表,而是一个Grouper对象+axes是一个多维numpy数组。你可能考虑将其添加到你的答案中@EEE ;) - Gael Lorieul
2
这在matplotlib 3.6中已被弃用。目前的预期方法是什么? - Puff
ax2._shared_axes['x'].remove(ax2) 对我来说起作用了 - D.Thomas

4
目前还没有现成的简单方法来实现这一点,但我认为它是可以做到的(只需要深入了解matplotlib内部)。底层的坐标轴链接方式是通过使用相同的定位器和格式化对象来实现的。要链接/取消链接,您需要复制/创建所有这些对象,并更新一些辅助结构(_shared_x_axes_shared_y_axes)。查看matplotlib.axes.Axes.cla()的实现,以了解您需要做什么。
存储库中有一个拉取请求添加了此功能和相关的功能请求。如果您熟练掌握a)从源代码安装b)使用主分支和c)应用此补丁,我认为开发人员会感激您测试这个功能。

谢谢tcaswell!我会尽力而为。但是,由于我仍然是Python的初学者,所以对于您提到的a)b)和c),我不是很自信。不过,我已经试着深入了解模块来修改导航工具栏,所以我想我会再次努力! :) - Jdawleer

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)
如果您想更好地理解,可以在此处查看文档hereax1._shared_x_axes是一个Grouper对象,在其中ax1和ax2是联合元素。
使用ax2.get_shared_x_axes()方法只能读取它,但不能更改它。要应用修改,您需要直接访问此对象ax2._shared_x_axes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接