2016-07-04 59 views
1

時々、一連のデータ全体が利用できない状況があります。私はセンサーからの値をプロットするリアルタイムです。これらはユーザーのやりとりでオンとオフを切り替えることができます。したがって、値が常にシリーズになっているかどうかはわかりません。ユーザーはセンサーを起動してから、再度オン/オフすることができますが、この場合、matplotlibは最後のエンドポイントと新しいスタートポイントから線を引いていきます。matplotlibが欠損値を外挿/プロットするのはなぜですか?

次のように私はプロットされたデータだった:

[[ 5.   22.57011604] 
[ 6.   22.57408142] 
[ 7.   22.56350136] 
[ 8.   22.56394005] 
[ 9.   22.56790352] 
[ 10.   22.56451225] 
[ 11.   22.56481743] 
[ 12.   22.55789757] 
    #Missing x vals. Still plots straight line.. 
[ 29.   22.55654716] 
[ 29.   22.56066513] 
[ 30.   22.56110382] 
[ 31.   22.55050468] 
[ 32.   22.56550789] 
[ 33.   22.56213379] 
[ 34.   22.5588932 ] 
[ 35.   22.54829407] 
[ 35.   22.56697655] 
[ 36.   22.56005478] 
[ 37.   22.5568161 ] 
[ 38.   22.54621696] 
[ 39.   22.55033493] 
[ 40.   22.55079269] 
[ 41.   22.55475616] 
[ 41.   22.54783821] 
[ 42.   22.55195618]] 

は、私のプロット機能は、次のように簡略化にたくさん見える:それはそのようにし、なぜ

def plot(self, data) 
    for name, xy_dict in data.iteritems(): 
     x_vals = xy_dict['x_values'] 
     y_vals = xy_dict['y_values'] 
     line_to_plot = xy_dict['line_number'] 
     self.lines[line_to_plot].set_xdata(x_vals) 
     self.lines[line_to_plot].set_ydata(y_vals) 

誰でも知っていますか?プロットする際に、非連続のxとyの値を世話しなければならないのですか? matplotlibはこれを自分で処理する必要があります。そうでなければリストを小さなリストに分割してプロットする必要がありますか?

答えて

2

1つのオプションは、データが欠落している場合はどこにでもダミーアイテムを追加することです(場合によってはxが1以上変化した場合)、マスクされた要素として設定します。こうすることで、matplotlibは線分をスキップします。例えば:

import numpy as np 
import matplotlib.pylab as pl 

# Your data, with some additional elements deleted... 
data = np.array(
[[ 5., 22.57011604], 
[ 6., 22.57408142], 
[ 9., 22.56790352], 
[ 10., 22.56451225], 
[ 11., 22.56481743], 
[ 12., 22.55789757], 
[ 29., 22.55654716], 
[ 33., 22.56213379], 
[ 34., 22.5588932 ], 
[ 35., 22.54829407], 
[ 40., 22.55079269], 
[ 41., 22.55475616], 
[ 41., 22.54783821], 
[ 42., 22.55195618]]) 

x = data[:,0] 
y = data[:,1] 

# Difference from element to element in x 
dx = x[1:]-x[:-1] 

# Wherever dx > 1, insert a dummy item equal to -1 
x2 = np.insert(x, np.where(dx>1)[0]+1, -1) 
y2 = np.insert(y, np.where(dx>1)[0]+1, -1) 

# As discussed in the comments, another option is to use e.g.: 
#x2 = np.insert(x, np.where(dx>1)[0]+1, np.nan) 
#y2 = np.insert(y, np.where(dx>1)[0]+1, np.nan) 
# and skip the masking step below. 

# Mask elements which are -1 
x2 = np.ma.masked_where(x2 == -1, x2) 
y2 = np.ma.masked_where(y2 == -1, y2) 

pl.figure() 
pl.subplot(121) 
pl.plot(x,y) 
pl.subplot(122) 
pl.plot(x2,y2) 

enter image description here

+1

本当に素敵です!先端に感謝します。私は現在、np.nanを使って、明らかに動作する回線を中断することを検討しています。私は最初にそれを試してみましょう。 – enrm

+0

@Bartのマスキングオプションは素晴らしいです。私は通常、同じ効果 'x2 = np.insert(x、np.where(dx> 1)[0] +1、NaN)'を達成するためにNaNを使用し、マスクする必要はありません。 – Aguy

+0

はい、私は同意します...私はマスクされた配列(無効な値を保持します)を好む傾向がありますが、この場合、無効な値を明示的に追加しているので、その必要はありません。 – Bart

0

Matplotlibは、あなたのすべてのデータポイントをラインで接続します。

これを避けたい場合は、欠落しているx値でデータを分割し、2つの分割リストを別々にプロットすることができます。

+0

を以前のように私はまだ、xとyのデータを設定することができますか、私は新しい行にそれらをプロットする必要がありますか? (色が変わるなど、それほど良いことではないでしょう)。私はデータポイントが同じmatplotlibライン上にあった方が好きです – enrm

2

別のオプションは、yの値としてNone又はnumpy.nanを含めることです。

これは、例えば、切断ラインを示しています。

import matplotlib.pyplot as plt 
plt.plot([1,2,3,4,5],[5,6,None,7,8]) 
+0

これも見つけました。現在、@Bartがnp.nanを使用する答えを組み込もうとしていますが、何らかのエラーが発生しています。よろしく! – enrm

関連する問題