2013-12-18 6 views
11

matplotlib के साथ कुछ बिंदुओं को साजिश करते समय मुझे ग्राफ बनाने के दौरान कुछ अजीब व्यवहार का सामना करना पड़ा। इस ग्राफ का उत्पादन करने के लिए कोड यहां दिया गया है।अनसुलझा डेटा के साथ matplotlib ग्राफ को छेड़छाड़

import matplotlib.pyplot as plt 
desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350] 
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699] 

fig = plt.figure() 
ax = plt.subplot(111) 

fig.suptitle('title') 
plt.xlabel('x') 
plt.ylabel('y') 

ax.plot(desc_x, rmse_desc, 'b', label='desc') 
ax.legend() 
plt.show() 

यहाँ ग्राफ यह बनाता है

graph with lines

आपको बता सकते हैं, यह ग्राफ, लाइनों अन्तर्विभाजक है कुछ एक एक लाइन ग्राफ में नहीं देखता है। जब मैं अंक को अलग, और लाइनों आकर्षित नहीं है, मैं इस परिणाम मिलता है:

graph without lines

आपको बता सकते हैं, वहाँ एक तरह से लाइनों अन्तर्विभाजक बिना इन बातों कनेक्ट करने के लिए है।

matplotlib ऐसा क्यों करता है? मुझे लगता है कि मैं अपने xcolumn को बिना छेड़छाड़ किए इसे ठीक कर सकता हूं, लेकिन अगर मैं इसे सॉर्ट करता हूं, तो मैं x1 से y1 तक मैपिंग खो दूंगा।

+0

वहाँ 'desc_x' और' rmse_desc' के बीच किसी भी कार्यात्मक संबंध है? –

उत्तर

16

आप numpy के argsort फ़ंक्शन का उपयोग करके ऑर्डर को बनाए रख सकते हैं।

Argsort "... क्रमबद्ध क्रम में दिए गए अक्ष के साथ उस इंडेक्स डेटा के समान आकार के सूचकांक की एक सरणी देता है।", इसलिए हम इसका उपयोग x और y निर्देशांक को दोबारा क्रमबद्ध करने के लिए कर सकते हैं। यहाँ यह कैसे किया है:

import matplotlib.pyplot as plt 
import numpy as np 

desc_x =[4000,3000,2000,2500,2750,2250,2300,2400,2450,2350] 
rmse_desc = [.31703 , .31701, .31707, .31700, .31713, .31698, .31697, .31688, .31697, .31699] 

order = np.argsort(desc_x) 
xs = np.array(desc_x)[order] 
ys = np.array(rmse_desc)[order] 

fig = plt.figure() 
ax = plt.subplot(111) 

fig.suptitle('title') 
plt.xlabel('x') 
plt.ylabel('y') 

ax.plot(xs, ys, 'b', label='desc') 
ax.legend() 
plt.show() 

enter image description here

+0

ग्रेट, धन्यवाद। क्या मेरा अनुमान सही था, कि ग्राफ इतना अजीब लग रहा था क्योंकि एक्स वैल्स को छोड़ा गया था? – nook

+1

आह, हाँ यह सही है। Matplotlib आपके द्वारा प्रदान किए गए क्रम में प्रत्येक जोड़ी के बीच लाइनों को आकर्षित करेगा। – YXD

+0

आप 'xs, ys = ज़िप (* क्रमबद्ध (ज़िप (desc_x, rmse_desc)) के साथ कुछ भी कर सकते हैं), लेकिन मैं numpy रास्ता पसंद करते हैं – YXD

संबंधित मुद्दे