2016-04-08 13 views
0

Ich habe eine Liste y, die enthält nan jeder nach reellen Zahl, die verhindert, dass Linien verbunden werden, wenn in Matplotlib geplottet. Ich kann versuchen, dies mit np.isfinite() durch Maskierung nan Daten zu plotten. Kann ich jedoch ignorieren nan, wenn sie mehr als 5 sind - so Linie Verbindung tritt nicht in dem Bereich mit mehr als 5 nan s. pandas hat eingebaut series.fillna(limit=2), die ideal scheint, aber ich möchte nan nicht ersetzen. Ich brauche wirklich ein Beispiel, wie das gemacht werden kann.Join NaN Werte in Matplotlib

Der gewünschte Ausgang ist unten angegeben (mit einer Lücke zwischen 7 und 14).

import matplotlib.pyplot as plt 
import numpy as np 
x = np.arange(20) 
y = [np.nan, 5, np.nan, np.nan, 3, np.nan, 10, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 2, np.nan, 7, np.nan, 22, np.nan, 15, np.nan] 

plt.plot(x,y, '-') 

enter image description here

Antwort

1

Ich sehe keinen Weg, dies sauber vektorisieren.

Wenn Sie wirklich nur eine Handvoll Punkte haben, schreiben Sie einfach eine Schleife könnte es

def brute_force_clean_nans(x, y): 
    x_clean, y_clean = [], [] 
    cnt = 0 
    for _x, _y in zip(x, y): 
     if np.isnan(_y): 
      cnt += 1 
      if cnt == 5: 
       # on the 5th nan, put it in the list to break line 
       x_clean.append(_x) 
       y_clean.append(_y) 
      continue 
     cnt = 0 
     x_clean.append(_x) 
     y_clean.append(_y) 
    return x_clean, y_clean 

Sie auch mit np.where Dinge tun zu tun, an den Läufen usw. suchen, aber wenn Sie diese paar Punkte haben es ist es wahrscheinlich nicht wert.

+0

Ich habe Ihren Code noch nicht versucht, aber ich habe über 160 Serien mit mehr als 20.000 Daten. Nicht sicher, ob es machbar ist, jeden einzelnen Datenpunkt zu durchlaufen. Ich werde Sie später wissen lassen – Curtis

+0

Ich habe Ihren Code korrigiert, der einen Fehler enthielt. Ansonsten vielen Dank für die Lösung meines Problems! – Curtis

+0

Entschuldigung für den Tippfehler. – tacaswell

Verwandte Themen