如何共享两个子图创建后的 x 轴

我试图共享两个子图轴,但是我需要在创建图形之后共享 x 轴。例如,我创建了这个图形:

import numpy as np
import matplotlib.pyplot as plt


t = np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)


fig = plt.figure()
ax1 = plt.subplot(211)
plt.plot(t,x)
ax2 = plt.subplot(212)
plt.plot(t,y)


# some code to share both x axes


plt.show()

我想插入一些代码来共享两个 x 轴,而不是注释。 我该怎么做呢? 有一些相关的听起来属性吗 _shared_x_axes_shared_x_axes时,我检查数字轴(fig.get_axes()) ,但我不知道如何联系他们。

185030 次浏览

共享轴的通常方法是在创建时创建共享属性

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

或者

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

因此,在创建轴之后共享它们应该是没有必要的。

但是,如果出于某种原因,您需要使用 共享创建后的轴(实际上,使用不同的库来创建一些子图,比如 给你可能是一个原因) ,那么仍然有一个解决方案:

吸毒

ax1.get_shared_x_axes().join(ax1, ax2)

创建两个轴之间的链接,ax1ax2。与创建时的共享不同,您必须为其中一个轴手动关闭 xticlabel (如果需要的话)。

一个完整的例子:

import numpy as np
import matplotlib.pyplot as plt


t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)


fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)


ax1.plot(t,x)
ax2.plot(t,y)


ax1.get_shared_x_axes().join(ax1, ax2)
ax1.set_xticklabels([])
# ax2.autoscale() ## call autoscale if needed


plt.show()

另一个答案有处理轴列表的代码 :

axes[0].get_shared_x_axes().join(axes[0], *axes[1:])

再加上欧内斯特上面的回答:

如果你有一个完整的 list轴对象,你可以一次传递所有的对象,并通过解压缩列表来共享它们的轴,如下所示:

ax_list = [ax1, ax2, ... axn] #< your axes objects
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list)

以上将把它们联系在一起。当然,你可以得到创造性和子集你的 list链接只有一些。

注:

为了将所有的 axes链接在一起,您必须在调用中包含 axes_list的第一个元素,尽管事实上您是从第一个元素开始调用 .get_shared_x_axes()的!

所以这样做,这显然是合乎逻辑的:

ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list[1:])

... 将导致所有 axes对象连接到第一个 除了上,它将完全独立于其他对象。

从 Matplotlib V3.3开始,现在已经有了 Axes.sharexAxes.sharey方法:

ax1.sharex(ax2)
ax1.sharey(ax3)