2013-04-02 21 views
5
Ben PyLab kullanarak serpme çizim çizmek istiyorum

ile veri kümelerinin saçılım oluşturun, ancak, benim bazı verilerin böyle, NaN şunlardır: Çizmek/NaN

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

pylab.scatter(a,b)

çalışmaz.

Bu NaN değerini görüntülemezken gerçek değer noktalarını çizebileceğim bir yol var mı?

+1

o http://stackoverflow.com/questions/11620914/removing-nan-values-from-an-array anlatıldığı gibi NaN değerleri kaldırmak için yeterli misiniz? –

cevap

12

NaN s'yi kullanırsanız işler mükemmel çalışır. None aynı şey değil. Bir NaN bir şamandıradır. Örnek olarak

:

import numpy as np 
import matplotlib.pyplot as plt 

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

enter image description here

verileri eksik işlemek istiyorsanız (verilerinizi yüklemek ve numpy.genfromtxt) pandas veya numpy maskeli diziler göz at. Maskeli diziler numpy içine yerleştirilmiştir, ancak pandas son derece kullanışlı bir kütüphanedir ve çok iyi bir eksik değer işlevselliğine sahiptir. Bir örnek olarak

:

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 maskelenmiş dizileri ayrı bir maske dizisi kullanırken, maskeli verileri temsil etmek için NaN s kullanır. Bu, maskelenmiş dizilerin geçici olarak orijinal verileri koruduğu ve geçici olarak "eksik" veya "kötü" olarak işaretlendikleri anlamına gelir. Bununla birlikte, daha fazla bellek kullanırlar ve eksik verileri temsil etmek için NaN s kullanılarak önlenebilecek gizli bir tutacakları vardır. maskeli diziler ve NaN s ikisini de kullanarak başka örnek olarak

, doğru çizimi bu kez: Eğer 2B uzayda çizim Çünkü

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

Ben de böyle arıyorum. Teşekkürler! – yangsuli

+0

Eğer NaN ve semilogy kullanıyorsanız işler iyi çalışmaz ... arsa iyi görünecek, ancak bu uyarıyı atar: RuntimeWarning: geçersiz değer karşılaşıldı less_equal maske = a <= 0.0 – poleguy

1

, puanlarınız tarafından tanımlanması gerekir hem bir X hem de bir Y değeri. Değerlerden biri Yok ise, bu nokta 2B alanda bulunamaz, bu nedenle çizilemez, dolayısıyla hem Yok'u hem de karşılık gelen değeri diğer listeden kaldırmalısınız. Bunu gerçekleştirmenin birçok yolu vardır. İşte biri:

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

Eğer dikkatli değilseniz [i] ... '. Her iki dizide de sıfır varsa bunları kaldıracaksınız. Sıfır mükemmel geçerli bir değer! –

+0

@Joe Kington: Haklısınız. Gönderiyi düzenledim. –