2012-01-20 7 views
6

私は線を形成するy値の配列を持っています。さらに、私は0から1の範囲の値のy配列と同じ数の要素を持つ配列を持っています。この配列を 'z'と呼んでいます。各点の色がz値に対応するように、y値の配列をプロットする必要があります。matplotlibのgnuplot linecolor変数?

plot ’data’ using 1:2:3 with points lc variable 

ここからアドバイスを使用して::

はgnuplotのでは、あなたは「LC変数」を使用してこれを行うことができます Matplotlib scatterplot; colour as a function of a third variableは、私が仕事をした散布図を、使用することができました。

import matplotlib as mpl 
import matplotlib.pyplot as plt 

plt.scatter(x, y, c=z, s=1, edgecolors='none', cmap=mpl.cm.jet) 
plt.colorbar() 
plt.show() 

これと同様のmatplotlibの中にプロット法、でこれを行う方法はありますか?

plt.plot(x, y, c=z) 

上記のコードを試したところ、すべての行が黒く表示されました。

+0

'LCのvariable'はに基づい* *ラインタイプのインデックスを選択します最後の列の値。色として使用するには、たとえばを使用します。 'lc palette z'です。 – Christoph

答えて

2

あなたが飛散使用することができます:あなたはipython -pylabセッションを持ってここに

plt.scatter(range(len(y)), y, c=z, cmap=cm.hot) 

を:

In [27]: z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9] 

In [28]: y = [3, 7, 5, 6, 4, 8, 3, 4, 5, 2, 9] 

In [29]: plt.scatter(range(len(y)), y, s=60, c=z, cmap=cm.hot) 
Out[29]: <matplotlib.collections.PathCollection at 0x9ec8400> 

enter image description here

あなたはプロットを使用する場合は、それに相当する数値を得ることができます上記で(pycrustセッション):

>>> from matplotlib import pyplot as plt 
>>> from matplotlib import cm 
>>> y = [3,7,5,6,4,8,3,4,5,2,9] 
>>> z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9] 
>>> for x, (v, c) in enumerate(zip(y,z)): 
...  plt.plot(x,v,marker='o', color=cm.hot(c)) 
...  
[<matplotlib.lines.Line2D object at 0x0000000008C42518>] 
[<matplotlib.lines.Line2D object at 0x0000000008C426D8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C42B38>] 
[<matplotlib.lines.Line2D object at 0x0000000008C452B0>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45438>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45898>] 
[<matplotlib.lines.Line2D object at 0x0000000008C45CF8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C48198>] 
[<matplotlib.lines.Line2D object at 0x0000000008C485F8>] 
[<matplotlib.lines.Line2D object at 0x0000000008C48A58>] 
[<matplotlib.lines.Line2D object at 0x0000000008C4B1D0>] 
>>> plt.show() 
>>> 
+0

ジョアキンありがとう。私はplotの代わりにscatterを使うことに決めました。 –

17

私は同じ問題を抱えていました。第3の変数(z)に依存したい、一様でない色の線をプロットしたかったのです。

しかし、私は間違いなくマーカではなく、ラインを使用したいと思っていました(@ joaquinの答えのように)。 クラスmatplotlib.collections.LineCollection(リンクhere)を使用してmatplotlib gallery exampleに解決策が見つかりました。ここで

は、その高さに応じてそれらを着色、ベースマップに軌跡をプロットした、私の例である:gnuplotので

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from matplotlib.collections import LineCollection 
import numpy as np 

m = Basemap(llcrnrlon=-42,llcrnrlat=0,urcrnrlon=5,urcrnrlat=50, resolution='h') 
fig = plt.figure() 
m.drawcoastlines() 
m.drawcountries() 

for i in trajectorias: 
    # for each i, the x (longitude), y (latitude) and z (height) 
    # are read from a file and stored as numpy arrays 

    points = np.array([x, y]).T.reshape(-1, 1, 2) 
    segments = np.concatenate([points[:-1], points[1:]], axis=1) 

    lc = LineCollection(segments, cmap=plt.get_cmap('Spectral'), 
         norm=plt.Normalize(250, 1500)) 
    lc.set_array(z) 
    lc.set_linewidth(2) 

    plt.gca().add_collection(lc) 

axcb = fig.colorbar(lc) 
axcb.set_label('cota (m)') 

plt.show() 

height dependent trajectories

+0

非常に良い例です! – Christoph

+0

線分間のスムーズな遷移をするには、 'segments = np.concatenate([points [: - 2]、points [1:-1]、points [2:]]、axis = 1)'を実行することができます。 – shockburner