如何在创建后分享两个子图的x轴?

时间:2017-03-23 10:20:47

标签: python matplotlib share axis

我试图共享两个子图轴,但我需要在创建图形后共享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 axis

plt.show()

我会插入一些代码来共享两个x轴而不是注释。 我没有找到任何线索如何做到这一点。有一些属性 {i> _shared_x_axes_shared_x_axes当我查看轴(fig.get_axes())时,我不知道如何链接它们。

3 个答案:

答案 0 :(得分:66)

共享轴的常用方法是在创建时创建共享属性。任

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

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

因此无需在创建轴之后共享轴。

但是,如果出于任何原因,您需要在创建轴之后共享轴(实际上,使用创建一些子图的其他库,例如here或{{3}可能是一个原因),仍然会有一个解决方案:

使用

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

在两个轴ax1ax2之间创建链接。与创建时的共享相比,您必须手动为其中一个轴设置xticklabels(如果需要)。

一个完整的例子:

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()

答案 1 :(得分:3)

从 Matplotlib v3.3 开始,现在存在 Axes.sharexAxes.sharey 方法:

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

答案 2 :(得分:0)

只是为了补充上面的ImportanceOfBeingErnest的回答:

如果您有一整个 list 轴对象,您可以一次传递它们,并通过像这样解包列表来共享它们的轴:

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

以上将所有这些链接在一起。当然,您可以发挥创意并将您的 list 设置为仅链接其中的一部分。

注意:

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

这样做,这肯定是合乎逻辑的:

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

... 将导致将所有 axes 对象链接在一起除了第一个对象,第一个对象将保持完全独立于其他对象。