凡例とエラーバー プロット コマンドのかなり奇妙な動作に遭遇しました。私は Python xy 2.7.3.1 を使用してmatplotlib 1.1.1
います。以下のコードは、観察された動作を例示しています。
import pylab as P
import numpy as N
x1=N.linspace(0,6,10)
y1=N.sin(x1)
x2=N.linspace(0,6,5000)
y2=N.sin(x2)
xerr = N.repeat(0.01,10)
yerr = N.repeat(0.01,10)
#error bar caps visible in scatter dots
P.figure()
P.subplot(121)
P.title("strange error bar caps")
P.scatter(x1,y1,s=100,c="k",zorder=1)
P.errorbar(x1,y1,yerr=yerr,xerr=xerr,color="0.7",
ecolor="0.7",fmt=None, zorder=0)
P.plot(x2,y2,label="a label")
P.legend(loc="center")
P.subplot(122)
P.title("strange legend behaviour")
P.scatter(x1,y1,s=100,c="k",zorder=100)
P.errorbar(x1,y1,yerr=yerr,xerr=xerr,color="0.7",
ecolor="0.7",fmt=None, zorder=99)
P.plot(x2,y2,label="a label", zorder=101)
P.legend(loc="center")
P.show()
これにより、次のプロットが得られます。
ご覧のとおり、エラーバーのキャップが散布図を上書きしています。zorder を十分に大きくすると、これは発生しなくなりますが、プロット ラインによって凡例が上書きされます。この問題は、matplotlibのこの zorder 問題に関連している疑いがあります。
迅速で汚い、ハックなソリューションも高く評価されています。
編集(@nordevに感謝):望ましい結果は次のとおりです。
- エラーバー、およびエンド キャップは、散布図ポイントの下になければなりません。
- ライン プロットは、散布図とエラー バーの上にある必要があります。
- 伝説は何よりも優先される
あなたの答えに従ってzorderを調整する:
P.legend(zorder=100)
-->self.legend_ = mlegend.Legend(self, handles, labels, **kwargs) TypeError: __init__() got an unexpected keyword argument 'zorder'
P.errorbar(zorder=0)
、P.scatter(zorder=1)
、...あなたが正しく示唆したように、それでも同じプロットが得られ、エラーバーのキャップはまだ散布点の上にあります。それに応じて上記の例を修正しました。