2011-06-20 23 views
1

LineCollectionを使用してラインプロットのスタックを作成したいとします。これまでのところ良い作成後のmatplotlib LineCollectionのオフセットを変更する方法

import matplotlib.pyplot as plt 
import matplotlib.collections 
import numpy as np 

x=np.arange(1000) 
y=np.sin(x/50.) 
l=zip(x,y) 

f=plt.figure() 
a=f.add_subplot(111) 
lines=matplotlib.collections.LineCollection((l,l), offsets=(0,0.2)) 
a.add_collection(lines) 
a.autoscale_view(True, True, True) 
plt.show() 

:次のコードは、(0、0.2)によって互いにオフセット二つの同じ正弦曲線を描きます。問題は、作成後にオフセットを調整できるようにすることです。 set_offsetsを使用すると、期待通りに動作していないようです。以下では、例えば、私が期待どおりに

a.collections[0].set_offsets((0, 0.5)) 

がところで、他のセットのコマンド(例えばset_color)が動作し、グラフに影響を及ぼしません。作成したカーブ間の間隔を変更するにはどうすればよいですか?

+0

わかりません。私は同じ問題を守っている。あなたはちょうど新しい軸を作成できますか? –

答えて

1

matplotlibにバグが見つかりましたが、私はいくつかの回避策があります。あなたが提供するオフセットを使用してLineCollection().__init__lines._pathsが生成されるようです。 lines._pathsは、lines.set_offsets()に電話するとプロパティが更新されません。あなたの簡単な例では、まだオリジナルを置いているので、パスを再生成することができます。

lines.set_offsets((0., 0.2)) 
lines.set_segments((l,l)) 

また、オフセットを手動で適用することもできます。オフセットポイントを変更していることに注意してください。オフセットを0.2にするには、既存のオフセット0.1に0.1を加えます。

lines._paths[1].vertices[:,1] += 1 
0

ありがとうございました。それに基づいて、新しいオフセット値に従ってカーブをシフトするが、古いオフセット値を考慮に入れた次のものを一緒にハッキングした。つまり、元のカーブデータを保持する必要はありません。 LineCollectionのset_offsetsメソッドを修正するために似たようなことが行われるかもしれませんが、クラスの詳細を理解してもそれを危険にさらすことはありません。

def set_offsets(newoffsets, ax=None, c_num=0): 
    ''' 
     Modifies the offsets between curves of a LineCollection 

    ''' 

    if ax is None: 
     ax=plt.gca() 

    lcoll=ax.collections[c_num] 
    oldoffsets=lcoll.get_offsets() 

    if len(newoffsets)==1: 
     newoffsets=[i*np.array(newoffsets[0]) for\ 
     (i,j) in enumerate(lcoll.get_paths())] 
    if len(oldoffsets)==1: 
     oldoffsets=[i*oldoffsets[0] for (i,j) in enumerate(newoffsets)] 

    verts=[path.vertices for path in lcoll.get_paths()] 

    for (oset, nset, vert) in zip(oldoffsets, newoffsets, verts): 
     vert[:,0]+=(-oset[0]+nset[0]) 
     vert[:,1]+=(-oset[1]+nset[1]) 

    lcoll.set_offsets(newoffsets) 
    lcoll.set_paths(verts) 
関連する問題