我正在尝试绘制一些子图,我似乎无法共享轴。我已经看过其他代码了,他们似乎正在做我正在尝试但我的似乎没有做任何事情。
我只是想在左边的四个子图中共享各自的轴,同时保持最右边的子图分开。
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()
正如您所看到的,尽管在plt.subplot命令中添加了sharex和sharey参数,但返回的图表显示了所有唯一的子图。
我确定我犯的是一个小错误,但我过去曾尝试过这个,并记住我有同样的问题!任何帮助表示赞赏,以及对替代方法的建议。即使是网站也有各种各样的方式来做同样的事情,这有点令人困惑。
答案 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数据,结果为:
但是,有一个更好的演示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()