2017-09-05 17 views
1

私はいくつかのサブプロットをプロットしようとしていますが、軸を共有できないようです。私は他のコードを見てきました。彼らは私が試みているように正確にやっているようですが、私のものは何もしていないようです。plt.subplot軸共有が機能しない

左の4つのサブプロットのそれぞれの軸を共有したいだけで、右端にサブプロットを分けておくだけです。

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

あなたはほぼあります。あなたが正しく軸を共有しますが、(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

はしかし、より良いデモがあります共有軸を使用してサブプロットを作成する場合はを参照してください。私は、コードの可読性/シンプルさを向上させるために.subplots()機能を使用する共有軸の見た最適なソリューション、例えば:

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

運のベスト。

+0

ありがとうございます! f、ax = plt.subplots(2、2 ...)に関して、私は、異なるサイズのサブプロットを持つプロットを生成することはできないと考えました。本当? – fffrost

+0

ええ、私もその結論に達したと思います。直線と異なるサイズの別の5番目のプロットをフォーマットする必要がある場合は、ソリューションが機能します。しかし、おそらくこれは、5番目のプロットを別々にグラフ化し、レンダリングされた図の書式設定を囲む文書で行うべきであることを示唆しています。 – 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

関連する問題