8 votes

Dessiner / Créer des diagrammes de dispersion d'ensembles de données avec NaN

Je veux dessiner un diagramme de dispersion en utilisant pylab, cependant, certaines de mes données sont NaN comme ceci :

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

pylab.scatter(a,b) ne fonctionne pas.

Y a-t-il un moyen pour que je puisse dessiner les points de valeur réelle tout en n'affichant pas ces NaN valeur ?

17voto

Joe Kington Points 68089

Les choses fonctionneront parfaitement si vous utilisez NaN s. None n'est pas la même chose. A NaN est un flotteur.

A titre d'exemple :

import numpy as np
import matplotlib.pyplot as plt

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

enter image description here

Jetez un coup d'œil à pandas ou des tableaux masqués numpy (et numpy.genfromtxt pour charger vos données) si vous voulez gérer les données manquantes. Les tableaux masqués sont intégrés dans numpy, mais pandas est une bibliothèque extrêmement utile, et possède une très belle fonctionnalité de valeur manquante.

A titre d'exemple :

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 utiliza NaN pour représenter les données masquées, tandis que les tableaux masqués utilisent un tableau de masques distinct. Cela signifie que les tableaux masqués peuvent potentiellement préserver les données originales, tout en les signalant temporairement comme "manquantes" ou "mauvaises". Cependant, ils utilisent plus de mémoire, et ont des problèmes cachés qui peuvent être évités en utilisant NaN pour représenter les données manquantes.

Autre exemple, l'utilisation de tableaux masqués et de l'option NaN mais cette fois avec un tracé linéaire :

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

1voto

Ionut Hulub Points 5543

Comme vous dessinez dans un espace 2D, vos points doivent être définis par une valeur X et une valeur Y. Si l'une des valeurs est None, le point ne peut pas exister dans l'espace 2D. Si l'une des valeurs est None, ce point ne peut pas exister dans l'espace 2D et ne peut donc pas être tracé. Vous devez donc supprimer à la fois la valeur None et sa valeur correspondante de l'autre liste.

Il existe plusieurs façons d'y parvenir. En voici une :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X