2017-07-18 74 views
1

我有一些数据的阵列,其中一些值是缺少虚线代替matplotlib缺失值

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

当我绘制它,我有这些NANS缺失(预计)

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

enter image description here

我想有是连接中缺失的段虚线。例如,在缺少数据点为3的情况下,应该有其缺少数据点7和8 2和4(在它们之间连接的现有点的虚线如果数据点是在间隔的边缘(数据点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

为了考虑在边缘值的情况下的水平线,可以检查它们是否南,并与邻近值替换它们。

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) 

需要注意的是,其连接缺失值第一绘图,然后非行缺失值是覆盖图(您也可以在调用绘图命令时使用 kwarg来控制绘图顺序)。上面的代码创建了这一点:

enter image description here

+0

任何想法如何应对边缘值? –

+0

有很多方法可以处理丢失的边缘数据,具体取决于您试图展示的内容。通常我会说,前面的'nan'值应该只被丢弃,但如果你使用'nan'表示有用的数据,如非检测化学分析时间序列的话,我可以考虑使用散点图填补'nan'值与分析方法检测限制。你的理由在丢失的数据可能会有所不同灌装,但一旦你选择了一个方法(和原因),你可以问一个问题,如果你想使用'matplotlib'绘制它你预想的方式帮助。 – aorr