2016-05-18 11 views
2

matplotlib.collections.PathCollectionの特定の要素に対して個別のプロパティ(たとえば、zorderおよびlabel)を設定したいとします。私はドキュメンテーションで方法を見つけることができませんでした。ここでmatplotlib.collections.PathCollection内の特定のパッチのプロパティを設定する

私は、ユーザーのケースを書き留めます。
ballsハンドル(matplotlib.collections.PathCollection)を使用して、赤いボールのzorderを上に移動して、このボールを変更したいとします。

balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4) 
plt.axis([-5, 5, -5, 5]) 

Overlapped balls

誰もがPathCollectionの個々のパスを微調整する方法についてのアイデアを持っていますか?

代替は、実際にハンドルのlistを返すplt.plot('o')を、使用されるであろう。残念ながら、plt.plot('o')ソリューションでは、すべてが同じグラフに属しているため、ボールごとに異なる色を設定することはできません。だからforループが必要です。

私は私の期限以降、Inkscapeので起こっている、私は行くよ賭ける抜本的な解決策:これは最適なソリューションです/

答えて

1

わからない場合、それはあなたを助けるかもしれません。

PathCollectionpathsは、作成された順に常にプロットされています。だからあなたの場合には、-1のx位置にpath1との1、その後、最初に作成されます。

あなたはballs.set_offsets()を使用して、あなたのケースで、offsetsを変更することで、最初にそれらをプロットした後、その順序を切り替えることができます

In [4]: balls = plt.scatter([-1, 1], [0, 0], c = ['r', 'b'], s = 4e4) 
In [5]: plt.axis([-5, 5, -5, 5]) 

これは、次の図を作成:今enter image description here

In [42]: print balls.get_offsets() 
[[-1. 0.] 
[ 1. 0.]] 

On [43]: balls.set_offsets([[1,0],[-1,0]]) 

を、これは持っています右側のボールの上に左手でボールをプロット:

enter image description here

このように、plt.scatterの呼び出しでその順序を['r','b']と設定しているため、これはfacecolorsを切り替えました。また、周りのfacecolorsを切り替えることでこれを解決するには、あります:

In [46]: balls.set_facecolors(['b','r']) 

enter image description here


グレートので、すべて一緒に、私たちはオフセットとのfacecolorsを切り替えるための関数を定義することができますことを置きますPathCollectionの任意の2つのpathsがあります。

import matplotlib.pyplot as plt 

fig,ax = plt.subplots() 
balls = ax.scatter([-3, -1, 1, 3], [0, 0, 0, 0], c = ['r', 'b', 'g', 'm'], s = 4e4) 
ax.set_xlim(-6,6) 
ax.set_ylim(-6,6) 

plt.savefig('balls_01.png') 

def switch_scatter(pathcoll,a,b): 

    # Switch offsets 
    offsets = pathcoll.get_offsets()[:] 
    offsets[[a,b]] = offsets[[b,a]] 

    # Switch facecolors 
    facecolors = pathcoll.get_facecolors() 
    facecolors[[a,b]] = facecolors[[b,a]] 

    # Switch sizes 
    sizes = pathcoll.get_sizes() 
    sizes[[a,b]] = sizes[[b,a]] 

    # Set the new offsets, facecolors and sizes on the PathCollection 
    pathcoll.set_offsets(offsets) 
    pathcoll.set_facecolors(facecolors) 
    pathcoll.set_sizes(sizes) 

switch_scatter(balls,2,1) 

plt.savefig('balls_02.png') 

相続人balls_01.png

enter image description here

そして、ここでは、我々はボール1とボール2を切り替えるballs_02.png((青と緑のボール)

enter image description here


です

フィーナl note:散布図で異なるプロパティがある場合(例: linecolor)、上記で定義した関数でそれらを切り替えなければなりません。

+0

OMG!素晴らしい!何が起こったのは、小さなボールが大きなボールの下に隠れていて、データと色の順序を変更しないようにしたかったということです。なぜなら、他の場所で使用されているからです。ラインプロットでは、私は 'zorder'を使いましたが、ここで私は同じように状況を処理することができませんでした。私はあなたの解決策を使用しますが、締め切り後にあなたの機能を理解しようとしますが、英語の説明は完全に意味があります。私の背中を見てくれてありがとう! – Atcold

+0

質問:どのようにして 'オフセット 'について知りましたか?あなたの行動を理解するだけです。 – Atcold

+0

完了時: '#スイッチサイズ' 'sizes = pathcoll.get_sizes()' 'sizes [[a、b]] = sizes [[b、a]]'そして 'pathcoll.set_sizes(sizes)'。 – Atcold

関連する問題