plt.subplot轴共享不起作用

时间:2017-09-05 21:00:06

标签: 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()

enter image description here

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

我确定我犯的是一个小错误,但我过去曾尝试过这个,并记住我有同样的问题!任何帮助表示赞赏,以及对替代方法的建议。即使是网站也有各种各样的方式来做同样的事情,这有点令人困惑。

2 个答案:

答案 0 :(得分:2)

你快到了。您正确地共享轴,但是需要使轴不可见(如Shared Axis Demo所示)以用于某些子图:

plt.setp(ax1.get_xticklabels(), visible=False)

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

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

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

Generated plots

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

f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex='col', sharey='row')

祝你好运。

答案 1 :(得分:1)

以下是使用plt.subplots的解决方案。我们的想法是将2x3网格中最右边的2个轴置于不可见的位置,而是在其位置创建一个新的子图。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10)

fig, ((ax1, ax2, aux1), (ax3, ax4, aux2)) = plt.subplots(2, 3, sharex=True, sharey=True)

#turn rightmost 2 axes off
aux1.axis("off")
aux2.axis("off")

#create a new subplot at their position
ax5 = fig.add_subplot(133)

#plot stuff on the axes
ax1.plot(x,np.sin(x))
ax2.plot(x,np.sin(x))
ax3.plot(x,np.sin(x))
ax4.plot(x,np.sin(x))
ax5.plot(5*x,x)

plt.show()

enter image description here