2017-04-03 6 views
2

これまでに見たすべてのタイプのプロットでは、matplotlibは値が与えられていないときに自動的に中央に表示されます。xlim(), ylim()例:Matplotlibはデフォルトでポリゴンプロットを中央に表示しませんか?

import matplotlib.pyplot as plt 
A_pts = [(162.5, 137.5), (211.0, 158.3), (89.6, 133.7)] 
ax = plt.subplot(111) 
ax.scatter(*A_pts) 
plt.show() 

enter image description here

しかし、私はプロットウィンドウが見えないポリゴンをもたらす両方の軸に対する制限[0, 1]で示されているPolygon

ax = plt.subplot(111) 
triangle = plt.Polygon(A_pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 
plt.show() 

をプロットします。明示的に適切な制限を渡してプロットウィンドウに表示させる必要があります。

ax.set_xlim(80, 250) 
ax.set_ylim(120, 170) 

これは設計上のものですか、それとも不足していますか?

+0

あなたは 'ax.relim()'と 'ax.autoscale_view()'()[ここ](http://stackoverflow.com/a/11039268/3026320からの)みました?つまり、グラフ上にデータをプロットするためのより「基本的な」種類の方法であることが設計上の可能性があります。 – berna1111

+1

私は、プロットに限界を渡す方法があることを知っています。私は、他のすべてのタイプについては、 'matplotlib'がこのタイプのプロットに対してデフォルトでそれをしないのだろうと思っています。 – Gabriel

+2

'add_patch'は実際には作図機能ではないので、アーティストコントロール機能と同じように設計されています。 'scatter 'のようなものは実際にあなたが渡したデータからアーティストを作ります - ' add_patch'はアーティストを作っていません。Axesオブジェクトに入れるだけです。 – Ajean

答えて

4

これは仕様です。 plotscatterのようなものは、データを取り込み、アーティストを作成し、プロットを形成し/軸を調整するプロット関数です。一方、add_patchは、アーティストコントロールの方法のほうが多いです(アーティストを作成せず、アーティスト自身が渡されます)。 Paul Hのコメントで述べたように、それは公開APIの最低レベルにあり、そのレベルではあなたがその図を完全に制御しているとみなされます。

+0

* 'APIのレベル*'とは何ですか?いくつかのコマンドを特定のレベルの一部にするのは何ですか? – ImportanceOfBeingErnest

+0

私はあなたが何をやっているのかよく分かりません。プログラマは "低レベル"と "高レベル"を理解する必要があります。「私はmatplotlibデベロッパーではないので、コードベース全体をどのように構築したかを明記することはできませんが、あなたが本当に望んでいたものではないと思われます。あなたの利益のために、私がコメントから引用したすべてのものをもっと明確にした。 – Ajean

+0

だからあなた(もしかしたら@PaulH)が持っているかどうか疑問に思っていた。 matplotlib APIをレベルに分割する理由私がコードを見ていると、ドキュメントの 'add_patch'も' plot'と同じレベルにあります。私はちょうど興味があります。;-)) – ImportanceOfBeingErnest

4

パッチを追加すると、軸のデータ制限が変更されます。この制限は、ax.dataLim.boundsと表示されます。ただし、add_patchはautomlimits関数を呼び出すのではなく、他のほとんどのプロットコマンドで呼び出されます。

これは、質問のように手動でプロットの限界を設定することができることを意味するか、ax.autoscale_view()と呼んで制限を調整することができます。後者では、あらかじめ限界を判断する必要がなく、マージンが維持されるという利点があります。

import matplotlib.pyplot as plt 
pts = [(162, 137), (211, 158), (89, 133)] 
ax = plt.subplot(111) 
triangle = plt.Polygon(pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 
print ax.dataLim.bounds 

ax.autoscale_view() 
plt.show() 

あなたが自動的に制限を拡張ない他のいくつかのプロットを追加したら、それ以上のautoscale_view()を呼び出す必要はありません。

import matplotlib.pyplot as plt 
pts = [(162, 137), (211, 158), (89, 133)] 
ax = plt.subplot(111) 
triangle = plt.Polygon(pts, fill=None, edgecolor='r') 
ax.add_patch(triangle) 

ax.plot([100,151,200,100], [124,135,128,124]) 

plt.show() 

enter image description here

関連する問題