创建两个子图后如何共享它们的 x 轴
How to share x axes of two subplots after they have been created
我正在尝试共享两个子图轴,但我需要在创建图形后共享 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()
) 但我不知道如何 link 它们。
共享轴的常用方法是在创建时创建共享属性。要么
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)
在两个轴 ax1
和 ax2
之间创建一个 link。与创建时的共享相反,您必须手动关闭其中一个轴的 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()
:
axes[0].get_shared_x_axes().join(axes[0], *axes[1:])
只是添加到上面的 ImportanceOfBeingErnest 的回答中:
如果您有整个 list
个坐标轴对象,您可以一次传递它们并通过像这样解压列表来共享它们的坐标轴:
ax_list = [ax1, ax2, ... axn] #< your axes objects
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list)
以上将 link 所有这些放在一起。当然,您可以发挥创意,将您的 list
子集设置为 link 其中的一部分。
注:
为了将所有 axes
link 组合在一起,您必须在调用中包含 axes_list
的第一个元素,尽管您正在调用 .get_shared_x_axes()
在开始的第一个元素上!
所以这样做,这显然符合逻辑:
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list[1:])
... 将导致 link 将所有 axes
对象组合在一起 除了 第一个对象,它将完全独立于其他对象。
自 Matplotlib v3.3 起,现在存在 Axes.sharex
、Axes.sharey
方法:
ax1.sharex(ax2)
ax1.sharey(ax3)
我正在尝试共享两个子图轴,但我需要在创建图形后共享 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()
) 但我不知道如何 link 它们。
共享轴的常用方法是在创建时创建共享属性。要么
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)
在两个轴 ax1
和 ax2
之间创建一个 link。与创建时的共享相反,您必须手动关闭其中一个轴的 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()
axes[0].get_shared_x_axes().join(axes[0], *axes[1:])
只是添加到上面的 ImportanceOfBeingErnest 的回答中:
如果您有整个 list
个坐标轴对象,您可以一次传递它们并通过像这样解压列表来共享它们的坐标轴:
ax_list = [ax1, ax2, ... axn] #< your axes objects
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list)
以上将 link 所有这些放在一起。当然,您可以发挥创意,将您的 list
子集设置为 link 其中的一部分。
注:
为了将所有 axes
link 组合在一起,您必须在调用中包含 axes_list
的第一个元素,尽管您正在调用 .get_shared_x_axes()
在开始的第一个元素上!
所以这样做,这显然符合逻辑:
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list[1:])
... 将导致 link 将所有 axes
对象组合在一起 除了 第一个对象,它将完全独立于其他对象。
自 Matplotlib v3.3 起,现在存在 Axes.sharex
、Axes.sharey
方法:
ax1.sharex(ax2)
ax1.sharey(ax3)