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


96

我正在尝试共享两个子图轴,但是在创建图形之后,我需要共享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轴。我没有找到任何线索我可以做到这一点。有一些属性 _shared_x_axes_shared_x_axes当我检查图轴(fig.get_axes())时,我不知道如何链接它们。

Answers:


137

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

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

要么

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

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

但是,如果出于任何原因,您需要在创建轴后共享轴(实际上,使用另一个库可以创建一些子图,例如here,或者共享插入轴可能是一个原因),仍然有解决方案:

使用

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

在两个轴之间创建链接,ax1并且ax2。与创建时的共享相比,您必须为其中一个轴手动设置xticklabel(以防万一)。

一个完整的例子:

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

顺便说一句,一个奇怪的原因是我用泡菜保存了一些图形,然后用另一个程序重新加载了它们,从而失去了sharex属性。
ymmx

4
这对于连接选择的子图很有用。例如,一个具有4个子项的图形:两个时间序列和两个直方图。这使您可以有选择地链接时间序列。
Hamid

2
Grouper对象的API文档:matplotlib.org/2.0.2/api/…–
michaelosthege

3
哦,我只是想出了如何取消共享轴(在大型网格中可能有用)的方法-在该轴上执行g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]。感谢您的起点!
naught101 '18

3
@ naught101您可以致电ax2.autoscale()
ImportanceOfBeingErnest
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.