2013-04-02 11 views
5

ich ein Streudiagramm mit pylab zeichnen möchten, jedoch sind einige meiner Daten NaN, wie folgt aus:Draw/Erstellen Scatterplots von Datensätzen mit NaN

a = [1, 2, 3] 
b = [1, 2, None] 

pylab.scatter(a,b) funktioniert nicht.

Gibt es eine Möglichkeit, die Punkte von echtem Wert zu zeichnen, ohne diese NaN Wert anzuzeigen?

+1

Wäre es ausreichen, um die NaN-Werte zu entfernen, wie in http://stackoverflow.com/questions/11620914/removing-nan-values-from-an-array beschrieben? –

Antwort

12

Die Dinge funktionieren perfekt, wenn Sie NaN s verwenden. None ist nicht das Gleiche. A NaN ist ein Schwimmer.

Als Beispiel:

import numpy as np 
import matplotlib.pyplot as plt 

plt.scatter([1, 2, 3], [1, 2, np.nan]) 
plt.show() 

enter image description here

Werfen Sie einen Blick auf pandas oder numpy maskierten Arrays (und numpy.genfromtxt Ihre Daten laden), wenn Sie fehlende Daten zu handhaben wollen. Maskierte Arrays sind in numpy integriert, aber pandas ist eine äußerst nützliche Bibliothek und hat eine sehr schöne Funktionalität für fehlende Werte.

Als Beispiel:

import matplotlib.pyplot as plt 
import pandas 

x = pandas.Series([1, 2, 3]) 
y = pandas.Series([1, 2, None]) 
plt.scatter(x, y) 
plt.show() 

pandas verwendet NaN s maskierten Daten darzustellen, während maskierten Arrays eine separate Maske Array. Dies bedeutet, dass maskierte Arrays die ursprünglichen Daten möglicherweise beibehalten können, während sie vorübergehend als "fehlend" oder "schlecht" gekennzeichnet werden. Sie verwenden jedoch mehr Arbeitsspeicher und haben versteckte Fehler, die vermieden werden können, indem NaN s verwendet wird, um fehlende Daten darzustellen.

Als weiteres Beispiel beide maskierte Arrays und NaN s verwenden, dieses Mal mit einem Liniendiagramm:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 6 * np.pi, 300) 
y = np.cos(x) 

y1 = np.ma.masked_where(y > 0.7, y) 

y2 = y.copy() 
y2[y > 0.7] = np.nan 

fig, axes = plt.subplots(nrows=3, sharex=True, sharey=True) 
for ax, ydata in zip(axes, [y, y1, y2]): 
    ax.plot(x, ydata) 
    ax.axhline(0.7, color='red') 

axes[0].set_title('Original') 
axes[1].set_title('Masked Arrays') 
axes[2].set_title("Using NaN's") 

fig.tight_layout() 

plt.show() 

enter image description here

+0

Das ist, was ich suche. Vielen Dank! – yangsuli

+0

Die Dinge werden nicht perfekt funktionieren, wenn Sie NaNs und Semilogie verwenden ... das Diagramm wird gut aussehen, aber es gibt diese Warnung: RuntimeWarning: ungültiger Wert in less_equal maske = a <= 0.0 – poleguy

1

Weil Sie im 2D-Raum zeichnen, um Ihre Punkte müssen durch definiert werden sowohl ein X- als auch ein Y-Wert. Wenn einer der Werte None ist, kann dieser Punkt nicht im 2D-Raum existieren, so dass er nicht geplottet werden kann. Daher sollten Sie sowohl den None als auch den entsprechenden Wert aus der anderen Liste entfernen.

Es gibt viele Möglichkeiten, dies zu erreichen. Hier ist eine:

a = [1, 2, 3] 
b = [1, None, 2] 

i = 0 
while i < len(a): 
    if a[i] == None or b[i] == None: 
     a = a[:i] + a[i+1:] 
     b = b[:i] + b[i+1:] 
    else: 
     i += 1 

"""Now a = [1, 3] and b = [1, 2]""" 

pylab.scatter(a,b) 
+0

Seien Sie vorsichtig mit 'wenn nicht a [i] ... '. Wenn eines der Arrays Nullen enthält, werden sie entfernt. Null ist ein absolut gültiger Wert! –

+0

@Joe Kington: Sie haben Recht. Ich habe den Beitrag bearbeitet. –

Verwandte Themen