2013-12-18 22 views
11

Bazı noktaları matplotlib ile çizerken grafik oluştururken bazı garip davranışlarla karşılaştım. İşte bu grafiği üreten kod. İşte Sıralanmamış verilerle kesişen matplotlib grafiği

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

Anlayacağınız gibi, bu grafik, tek bir çizgi grafikte görmez bir şeyi hatlarını kesen etti

graph with lines

oluşturduğu grafiktir. Ben noktaları izole ve çizgiler çizmek yok, ben bu sonucu elde: Anlayacağınız gibi

graph without lines

, kesişen çizgiler olmadan bu noktaları bağlamak için bir yolu yoktur.

Matplotlib bunu neden yapıyor? Sanırım xcolumn'um sıralanmamış olsa da onu düzeltebilirim, ama eğer onu sıralıyorumsa, x1'den y1'e eşlemeyi kaybedeceğim.

+0

var mı? –

cevap

16

Numaranın argsort işlevini kullanarak sırayı koruyabilirsiniz.

Argsort "..., belirli bir sırayla belirtilen eksen boyunca bu dizin verisiyle aynı şekildeki bir dizi dizin döndürür." Böylece, x ve y koordinatlarını birlikte yeniden sıralamak için bunu kullanabiliriz. Burada nasıl yapıldığını var: desc_x` ve `rmse_desc`` arasında herhangi fonksiyonel bir ilişki

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

Harika, teşekkürler. Tahminim doğruydu, grafik çok tuhaf görünüyordu, çünkü x değerleri sınıflandırılmamıştı? – nook

+1

Ah, evet bu doğru. Matplotlib, sağladığınız sırayla her bir çift arasındaki çizgileri çizecektir. – YXD

+0

Ayrıca, xs, ys = zip (* sıralanmış (zip (desc_x, rmse_desc))) 'ile benzer bir şey yapabilirsiniz, ancak ben numpy yolu tercih ederim – YXD

İlgili konular