2013-04-02 13 views
5

मैं pylab का उपयोग कर एक बिखराव साजिश आकर्षित करने के लिए चाहते हैं के साथ डेटासेट के Scatterplots बनाएं, फिर भी, मेरे डेटा के कुछ NaN कर रहे हैं, इस तरह:ड्रा/NaN

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

pylab.scatter(a,b) काम नहीं करता।

क्या कोई तरीका है कि मैं NaN मान प्रदर्शित नहीं करते समय वास्तविक मूल्य के अंक खींच सकता हूं?

+1

यह http://stackoverflow.com/questions/11620914/removing-nan-values-from-an-array में वर्णित के रूप NaN मूल्यों को दूर करने के लिए पर्याप्त हैं? –

उत्तर

12

यदि आप NaN एस का उपयोग करते हैं तो चीजें पूरी तरह से काम करेगी। None एक ही बात नहीं है। एक NaN एक फ्लोट है।

एक उदाहरण के रूप:

import numpy as np 
import matplotlib.pyplot as plt 

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

enter image description here

pandas या numpy नकाबपोश सरणियों पर एक नज़र (और numpy.genfromtxt अपने डेटा लोड करने के लिए) आप डेटा गुम को संभालने के लिए चाहते हैं, तो लो। मुखौटा सरणी numpy में बनाया गया है, लेकिन pandas एक बेहद उपयोगी पुस्तकालय है, और बहुत अच्छी अनुपलब्ध मूल्य कार्यक्षमता है।

एक उदाहरण के रूप:

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() 

pandasNaN रों उपयोग करता है, नकाबपोश डेटा का प्रतिनिधित्व करते हुए नकाबपोश सरणियों अलग मास्क सरणी का उपयोग करें। इसका मतलब यह है कि मास्क किए गए सरणी संभावित रूप से मूल डेटा को संरक्षित कर सकते हैं, जबकि अस्थायी रूप से इसे "गायब" या "खराब" के रूप में फ़्लैग करते हैं। हालांकि, वे अधिक मेमोरी का उपयोग करते हैं, और एक छुपा गेटचास है जिसे गायब डेटा का प्रतिनिधित्व करने के लिए NaN एस का उपयोग करके टाला जा सकता है।

एक और उदाहरण के रूप में, दोनों नकाबपोश सरणियों और NaN s का उपयोग करके, एक लाइन साजिश के साथ इस समय:

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

यही वह है जिसे मैं ढूंढ रहा हूं। धन्यवाद! – yangsuli

+0

यदि आप NaNs और semilogy का उपयोग करते हैं तो चीजें पूरी तरह से काम नहीं करेंगी ... साजिश ठीक दिखाई देगी, लेकिन यह इस चेतावनी को फेंकता है: रनटाइम चेतावनी: अमान्य मान कम_equal मुखौटा = <<0.0 – poleguy

1

क्योंकि आप 2 डी अंतरिक्ष में बना रहे हैं, अपने अंक से परिभाषित किया जा करने की जरूरत है एक एक्स और एक वाई मूल्य दोनों। यदि मानों में से कोई एक नहीं है, तो वह बिंदु 2 डी स्पेस में मौजूद नहीं हो सकता है, इसलिए इसे प्लॉट नहीं किया जा सकता है, इसलिए आपको अन्य सूची से कोई भी नहीं और यह संबंधित मान हटा देना चाहिए।

इसे पूरा करने के कई तरीके हैं। यहाँ एक है:

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

में सावधान रहें 'अगर नहीं [i] ... '। यदि सरणी में शून्य है, तो आप उन्हें हटा देंगे। शून्य एक पूरी तरह से वैध मूल्य है! –

+0

@ जो किंगटन: आप सही हैं। मैंने पोस्ट संपादित किया है। –