2017-07-18 16 views
1

における欠損値Iは、Iは、これらのNaNは点線の代わりにmatplotlibの

(予想される)私はそれをプロットしたときの値のいくつかは

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 

含まれていないいくつかのデータの配列、欠落しているました

fig, ax = plt.subplots() 
ax.plot(y) 
plt.show() 

enter image description here

私は何がしたいことは欠落しているセグメントを結ぶ点線です。例えば、3のデータポイントが欠落している場合、存在するポイントを2と4との間で結ぶ点線が存在するはずである(データポイント7と8の欠落についても同様である)。データポイントがデータポイント0 (前/次のデータポイントを利用できるエッジと同じを想像)、それらを結ぶ水平線を持っていると思います。


ここで私sawは(私が欲しいものではない)これらの空のセグメントを削除する方法を尋ねる質問。私は、補間された値と他のすべての値NANを持つ別の配列を作成することで解決できますが、複雑に見えます。

これは一般的なケースのように見えるので、アプローチ。

答えて

3

:上記のコードは、これを作成します。

import numpy as np 
import matplotlib.pyplot as plt 

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 
x = np.arange(0, len(y)) 
mask = np.isfinite(y) 

fig, ax = plt.subplots() 
line, = ax.plot(x[mask],y[mask], ls="--",lw=1) 
ax.plot(x,y, color=line.get_color(), lw=1.5) 

plt.show() 

enter image description here

エッジ値の場合には水平線を考慮するためには、彼らがNaNであるかどうかを確認し、隣接する値に置き換えてもよいです。

import numpy as np 
import matplotlib.pyplot as plt 

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23,np.NAN]) 
x = np.arange(0, len(y)) 
yp = np.copy(y) 
if ~np.isfinite(y[0]): yp[0] = yp[1] 
if ~np.isfinite(y[-1]): yp[-1] = yp[-2] 

mask = np.isfinite(yp) 


fig, ax = plt.subplots() 
line, = ax.plot(x[mask],yp[mask], ls="--",lw=1) 
ax.plot(x,y, color=line.get_color(), lw=1.5) 

plt.show() 

enter image description here

+0

エッジ値をどのように扱うか考えていますか? –

+0

エッジには値がありませんので、それをどうするのが先験的なことではありません。だから、あなたはそれが何らかの意味をうかがい、それがどんな価値があるべきかを知る必要があります。 – ImportanceOfBeingErnest

+0

私の質問では、私はエッジ値の場合、私は水平線を持っていると言いました。基本的に私が 'nan、43'を持っていれば、私は点線' 43、43'を持っていきたいと思います。 –

3

、あなたが探している効果のための迅速簡単な方法はそうのように二度同じシリーズをプロットすることである。そして、欠損値を結ぶ線が最初にプロットされていることを

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 
x = np.arange(len(y)) 
_y = y[~np.isnan(y)] 
_x = x[~np.isnan(y)] 
fig, ax = plt.subplots() 

ax.plot(_x, _y, linestyle="--", lw=.5) 
ax.plot(x, y, lw=1) 

注、非欠けている値はオーバーレイです(描画の制御にplotの呼び出しでzorder kwargを使用することもできます)。私はリンクの問題から解決策は、直接、直線の後ろに点線をプロット、ここで適用することが可能だと思います

enter image description here

+0

エッジ値に対処する方法任意のアイデア? –

+0

あなたが表示しようとしているものに応じて、欠けているエッジデータに対応する方法はたくさんあります。通常は、先行する 'nan'値は削除する必要がありますが、' nan'を使用して有用なデータを示す場合(化学分析の時系列データでは検出不可能な場合など)は、 「ナノ」値は分析方法の検出限界である。不足しているデータを埋める理由はさまざまですが、メソッド(および理由)を選択すると、 'matplotlib'を使用して想定しているようにプロットするのに役立つかどうかを尋ねることができます。 – aorr

関連する問題