4

凡例とエラーバー プロット コマンドのかなり奇妙な動作に遭遇しました。私は 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)、...あなたが正しく示唆したように、それでも同じプロットが得られ、エラーバーのキャップはまだ散布点の上にあります。それに応じて上記の例を修正しました。
4

1 に答える 1

6

作成されたプロットは、投稿したコードに従って正しいです。最も低い オブジェクトが下に配置され、最も高いzorderオブジェクトが上に配置されます。リンク先の zorder 問題は matplotlib バージョン 1.2.1 で修正されているため、可能であればインストールを更新する必要があります。 zorder

最初のサブプロットでは、errorbarが で呼び出されzorder=2、が でscatter呼び出されるため、エラーバーが散布点の上にプロットされzorder=1ます。つまり、エラーバーが散布点をオーバーレイします。

2 番目のサブプロットでは、errorbarwith zorder=99scatterwithzorder=100およびplotwith zorder=101- を呼び出しました。これは、エラーバーが散布点と線の両方の下に配置されることを意味します。

legendが最初のサブプロットの行の上に表示され、2 番目のサブプロットの同じ行の上に表示される理由は、凡例 objectazorder値を明示的に設定していないためです。そのデフォルト値(私は5だと思います)。凡例の zorder を変更するにP.legend(loc="center").set_zorder(102)は、102 が目的の zorder-value であるところを使用するだけです。

したがって、目的の出力を生成するには、zorderそれに応じて引数を設定する必要があります。質問で目的の出力を説明していないため、オブジェクトをどの順序で描画するかわからないため、コードを「修正」するのは困難です。

于 2013-05-27T10:13:17.027 に答える