2017-09-05 75 views
1

我想繪製一些subplots,我似乎無法共享座標軸。我看過其他的代碼,它們看起來像我試圖做的一樣,但我的似乎沒有做任何事情。plt.subplot軸共享不起作用

我只想分享左邊四個子圖中的各個座標軸,同時保持最右側的子圖分開。

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

正如你所看到的,儘管加入sharex和sharey參數到plt.subplot命令返回的情節顯示所有獨特的次要情節。

我敢肯定,我犯了一個小錯誤,但我已經嘗試過,並記住我有同樣的問題!任何幫助表示讚賞,以及對其他方法的建議。即使是網站也有不同的方式來做同樣的事情,這有點令人困惑。

回答

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

好運。

+0

謝謝!關於f,ax = plt.subplots(2,2 ...),我認爲不可能產生具有不同大小子圖的情節。真的嗎? – fffrost

+0

是的,我想我也得出這個結論。如果您需要使用不同大小的直線格式化單獨的第五個繪圖,那麼您的解決方案將起作用。但是,也許這表明第五個情節應該分開繪製,提交的數字的格式應該在封閉的文檔中完成。 – lcary

+0

@Icary對於可能使用'plt.subplots'進行破解,請參閱下面的答案。 – ImportanceOfBeingErnest

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