web-dev-qa-db-ja.com

matplotlibレイヤーの順序を指定する

次のスクリプトを実行するとします。

import matplotlib.pyplot as plt

lineWidth = 20
plt.figure()
plt.plot([0,0],[-1,1], lw=lineWidth, c='b')
plt.plot([-1,1],[-1,1], lw=lineWidth, c='r')
plt.plot([-1,1],[1,-1], lw=lineWidth, c='g')
plt.show()

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

enter image description here

Pythonを選択する代わりに、レイヤーの上下の順序を指定するにはどうすればよいですか?

31
Forklift17

なぜzorderにそのような振る舞いがあるのか​​はわかりませんが、それはおそらくバグであるか、少なくとも文書化されていない機能です。プロット(グリッド、軸など)を作成するとき、および要素にzorderを指定しようとするときに、zorderへの自動参照が既に存在するためである可能性があります。どういうわけかそれらを重複しています。これは、いずれの場合でも仮定です。

問題を解決するために、zorderの違いを誇張してください。たとえば、0,1,2の代わりに、0,5,10にします。

import matplotlib.pyplot as plt

lineWidth = 20
plt.figure()
plt.plot([0,0],[-1,1], lw=lineWidth, c='b',zorder=10)
plt.plot([-1,1],[-1,1], lw=lineWidth, c='r',zorder=5)
plt.plot([-1,1],[1,-1], lw=lineWidth, c='g',zorder=0)
plt.show()

、これは次のようになります。

Handling zorder in mataplotlib

このプロットでは、質問に示されている反対の順序を指定しました。

45
armatita

レイヤーは、プロット関数の対応する呼び出しと同じ順序で下から上に積み重ねられます。

import matplotlib.pyplot as plt

lineWidth = 30
plt.figure()

plt.subplot(2, 1, 1)                               # upper plot
plt.plot([-1, 1], [-1, 1], lw=5*lineWidth, c='b')  # bottom blue
plt.plot([-1, 1], [-1, 1], lw=3*lineWidth, c='r')  # middle red
plt.plot([-1, 1], [-1, 1], lw=lineWidth, c='g')    # top green

plt.subplot(2, 1, 2)                               # lower plot
plt.plot([-1, 1], [-1, 1], lw=5*lineWidth, c='g')  # bottom green
plt.plot([-1, 1], [-1, 1], lw=3*lineWidth, c='r')  # middle red
plt.plot([-1, 1], [-1, 1], lw=lineWidth, c='b')    # top blue

plt.show()

下の図から明らかなように、プロットはbottom first、top lastルールに従って配置されます。

How different plots are stacked

5
Tonechas