2013-04-02 10 views
5

voglio disegnare un grafico a dispersione utilizzando pylab, tuttavia, alcuni dei miei dati sono NaN, in questo modo:Draw/Creare Grafici a dispersione di set di dati con NaN

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

pylab.scatter(a,b) non funziona.

C'è un modo per disegnare i punti di valore reale senza visualizzare questi valori NaN?

+1

sarebbe sufficiente per rimuovere i valori NaN come descritto in http://stackoverflow.com/questions/11620914/removing-nan-values-from-an-array? –

risposta

12

Le cose funzioneranno perfettamente se si utilizza NaN s. None non è la stessa cosa. A NaN è un float.

Per fare un esempio:

import numpy as np 
import matplotlib.pyplot as plt 

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

enter image description here

Dai un'occhiata alla pandas o NumPy array mascherati (e numpy.genfromtxt per caricare i dati), se si desidera gestire i dati mancanti. Gli array mascherati sono incorporati in numpy, ma pandas è una libreria estremamente utile e presenta funzionalità di valore mancanti molto interessanti.

Ad esempio:

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 utilizza NaN s per rappresentare i dati mascherati, mentre le matrici mascherati utilizzano una matrice di maschera separata. Ciò significa che gli array mascherati possono potenzialmente conservare i dati originali, segnalandoli temporaneamente come "mancanti" o "cattivi". Tuttavia, usano più memoria e hanno dei trucchi nascosti che possono essere evitati usando NaN s per rappresentare i dati mancanti.

Come altro esempio, utilizzando entrambi gli array in maschera e NaN s, questa volta con una trama:

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

Questo è quello che sto cercando. Grazie! – yangsuli

+0

Le cose non funzioneranno perfettamente se usi NaNs e semilogy ... la trama andrà bene, ma genera questo avviso: RuntimeWarning: valore non valido rilevato in less_equal mask = a <= 0.0 – poleguy

1

Perché si sta disegnando nello spazio 2D, i punti devono essere definiti da sia un valore X che Y. Se uno dei valori è Nessuno, quel punto non può esistere nello spazio 2D, quindi non può essere tracciato, quindi è necessario rimuovere sia il Nessuno che il corrispondente valore dall'altra lista.

Ci sono molti modi per farlo. Qui è uno:

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

Stai attento con 'if not a [i] ... '. Se uno degli array ha zero, li rimuoverai. Zero è un valore perfettamente valido! –

+0

@Joe Kington: hai ragione. Ho modificato il post. –

Problemi correlati