plt.subplot 轴共享不起作用

fff*_*ost 5 python matplotlib

我正在尝试绘制一些子图,但似乎无法共享轴。我看过其他代码,他们似乎完全按照我的尝试做,但我的似乎没有做任何事情。

我只是想在左侧的四个子图中共享各自的轴,同时将最右侧的子图分开。

import numpy as np
import matplotlib.pyplot as plt

# set the data
x_data = np.linspace(0, 10)
y_data_1 = np.sin(x_data)
y_data_2 = np.cos(x_data)
y_data_3 = [i / 2 for i in y_data_1]
y_data_4 = [j / 2 for j in y_data_2]

# make the plot
ax1 = plt.subplot(2,3,1)
plt.plot(x_data, y_data_1)

ax2 = plt.subplot(2,3,2, sharey=ax1)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)

ax3 = plt.subplot(1,3,3)
plt.plot(x_data)

ax4 = plt.subplot(2,3,4, sharex=ax1)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)
plt.plot(x_data, y_data_3)

ax5 = plt.subplot(2,3,5, sharex=ax2, sharey=ax4)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)
plt.plot(x_data, y_data_3)
plt.plot(x_data, y_data_4)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如您所见,尽管在 plt.subplot 命令中添加了 sharex 和 sharey 参数,但返回的图显示了所有唯一的子图。

我确定我犯了一个小错误,但我过去曾尝试过,并记得我遇到了同样的问题!任何帮助表示赞赏,以及替代方法的建议。甚至网站也包含做同一件事的各种方法,这有点令人困惑。

cha*_*lor 5

您快到了。您正在正确共享轴,但需要使某些子图的轴不可见(按照Shared Axis Demo 的指示):

plt.setp(ax1.get_xticklabels(), visible=False)
Run Code Online (Sandbox Code Playgroud)

在您的代码中,这可能如下所示:

# make the plot
ax1 = plt.subplot(2, 3, 1)
plt.plot(x_data, y_data_1)
plt.setp(ax1.get_xticklabels(), visible=False)

ax2 = plt.subplot(2, 3, 2, sharey=ax1)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)
plt.setp(ax2.get_xticklabels(), visible=False)
plt.setp(ax2.get_yticklabels(), visible=False)

ax3 = plt.subplot(1, 3, 3)
plt.plot(x_data)

ax4 = plt.subplot(2, 3, 4, sharex=ax1)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)
plt.plot(x_data, y_data_3)

ax5 = plt.subplot(2, 3, 5, sharex=ax2, sharey=ax4)
plt.plot(x_data, y_data_1)
plt.plot(x_data, y_data_2)
plt.plot(x_data, y_data_3)
plt.plot(x_data, y_data_4)
plt.setp(ax5.get_yticklabels(), visible=False)

plt.show()
Run Code Online (Sandbox Code Playgroud)

该代码加上导入/声明的 x 和 y 数据,结果为:

生成的图

但是,这里有一个更好的演示用于创建具有共享轴的子图。我看到的共享轴的最佳解决方案使用该.subplots()函数来提高代码的可读性/简单性,例如:

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex='col', sharey='row')
Run Code Online (Sandbox Code Playgroud)

祝你好运。