web-dev-qa-db-ja.com

python pyplotを使用して、複数のサブプロットに水平線をプロットする

同じページに3つのサブプロットをプロットしています。すべてのサブプロットに水平線を引きたい。以下は私のコードと結果のグラフです:(すべてではありませんが、プロットの1つで水平線を取得できます)

gs1 = gridspec.GridSpec(8, 2)
gs1.update(left=0.12, right=.94, wspace=0.12)
ax1 = plt.subplot(gs1[0:2, :])
ax2 = plt.subplot(gs1[3:5, :], sharey=ax1)
ax3 = plt.subplot(gs1[6:8, :], sharey=ax1)

ax1.scatter(theta_cord, density, c = 'r', marker= '1')
ax2.scatter(phi_cord, density, c = 'r', marker= '1')
ax3.scatter(r_cord, density, c = 'r', marker= '1')
ax1.set_xlabel('Theta (radians)')
ax1.set_ylabel('Galaxy count')
ax2.set_xlabel('Phi (radians)')
ax2.set_ylabel('Galaxy count')
ax3.set_xlabel('Distance (Mpc)')
ax3.set_ylabel('Galaxy count')
plt.ylim((0,0.004))
loc = plticker.MultipleLocator(base=0.001)
ax1.yaxis.set_major_locator(loc)

plt.axhline(y=0.002, xmin=0, xmax=1, hold=None)

plt.show()

これにより、以下が生成されます。 enter image description here

繰り返しますが、最後のサブプロットに描いた線が最初の2つのサブプロットにも表示されるようにします。それ、どうやったら出来るの?

19
Abhinav Kumar

とにかくこれにつまずく人のためにそれをする方法を見つけました。

OPの次の行を置き換える必要があります。

plt.axhline(y=0.002, xmin=0, xmax=1, hold=None)

次のものに置き換えます。

ax1.axhline(y=0.002,xmin=0,xmax=3,c="blue",linewidth=0.5,zorder=0)
ax2.axhline(y=0.002,xmin=0,xmax=3,c="blue",linewidth=0.5,zorder=0)
ax3.axhline(y=0.002,xmin=0,xmax=3,c="blue",linewidth=0.5,zorder=0)

これにより、以下が生成されます。

enter image description here

33
Abhinav Kumar

ax1ax2、およびax3を定義したので、それらに水平線を簡単に描画できます。あなたは彼らのために別々にそれをする必要があります。ただし、コードは単純化できます。

for ax in [ax1, ax2, ax3]:
    ax.axhline(y=0.002, c="blue",linewidth=0.5,zorder=0)

axhline documentation によると、xminxmaxは(0,1)の範囲にある必要があります。 xmax=3.0という可能性はありません。軸を横切る水平線を描画すること(axhline methodのデフォルトの動作)を目的としているため、xminおよびxmaxパラメーターを省略できます。

3
jdhao