2012-10-17 28 views
8

Tôi cố gắng để vẽ một đường trong matplotlib .. Tôi đang tìm kiếm đúng loại suy .. Tôi muốn một cái gì đó như thế nàyLàm thế nào để vẽ dòng (chuỗi đa giác) với NumPy/scipy/matplotlib với tối thiểu mịn

taken from canvasxpress.org/line.html

nơi mỗi dòng được làm nhẵn. Tôi đã thử nhiều sự kết hợp của scipy và matplotlib, chẳng hạn như

x_new = np.arange(x, x_length, 1) 
tck = interpolate.splrep(x, y, s=3) 
y_new = interpolate.splev(x_new, tck, der=0) 
ax.plot(x_new, y_new, color+lstyle) 

nhưng kết quả tốt nhất mà tôi nhận được là

my result

Dòng đại diện một tăng biến .. vì vậy nó là một biểu sai . Tôi có thể tìm kiếm những gì?

Cảm ơn

Edit: Tôi đang suy nghĩ về việc thực hiện một phương pháp từ bản thân mình, nhưng tôi không biết nếu nó đã được đã được thực hiện .. mã giả là sau

take x and y 
calculate spline for each three points 
x[0], x[1], x[2] ... x[1], x[2], x[3] ... and so on 
for each y[n] sums every computation done for it and divide by number of 
computations (i.e. y[1] is computed for triplette x[0..2] and x[1..3] so the 
sum is divided by two (average for each point is taken as its value) 
+0

tại sao bạn suy? Đây có phải là tính thẩm mỹ hay bạn đang tuyên bố biết giá trị giữa các điểm dữ liệu của bạn? – tacaswell

+0

@tcaswell Tôi nội suy vì cả hai lý do, chủ yếu cho thẩm mỹ – gc5

Trả lời

8

Đối với loại biểu đồ đó, bạn muốn đơn điệu nội suy. Lớp PchipInterpolator (bạn có thể tham khảo bằng bí danh ngắn hơn pchip) trong scipy.suy thể được sử dụng:

import numpy as np 
from scipy.interpolate import pchip 
import matplotlib.pyplot as plt 


# Data to be interpolated. 
x = np.arange(10.0) 
y = np.array([5.0, 10.0, 20.0, 15.0, 13.0, 22.0, 20.0, 15.0, 12.0, 16.0]) 

# Create the interpolator. 
interp = pchip(x, y) 

# Dense x for the smooth curve. 
xx = np.linspace(0, 9.0, 101) 

# Plot it all. 
plt.plot(xx, interp(xx)) 
plt.plot(x, y, 'bo') 
plt.ylim(0, 25) 
plt.grid(True) 
plt.show() 

Kết quả:

enter image description here

+1

Đó là những gì tôi đã tìm kiếm :) Cảm ơn – gc5

1

Vấn đề là không phải là vấn đề hiển thị. Đó là một vấn đề nội suy. Bạn đang nội suy bằng cách sử dụng chức năng spline. Chọn phương pháp nội suy đúng là rất nhiều tùy thuộc vào loại dữ liệu bạn có. Bạn không thể mong đợi để có một chức năng nội suy mà sẽ hành xử ngay trong mọi trường hợp (nội suy không có cách nào để biết rằng chức năng của bạn đang gia tăng).

+0

thử sử dụng một hàm nội suy khác, như 'scipy.interpolate.interp1d()', điều chỉnh tham số 'loại' cho đến khi nó thỏa mãn bạn – gg349

+0

nhờ tôi sẽ thử nó. @ Nicolas có tôi đã sai .. Tôi sẽ thay đổi tiêu đề và nội dung của bài đăng này cho phù hợp – gc5

+0

@flebool Tôi đã thử tất cả các giá trị có thể cho loại nhưng không hài lòng với tôi .. :( – gc5

1

Bạn nên nhìn vào một trong hai

scipy.interpolate.LSQUnivariateSpline và chơi với tham số k (mức độ spline)

hoặc scipy.interpolate.UnivariateSpline và chơi với k và s tham số.

+0

Tôi đã thử nhưng nó không phải là những gì tôi đang tìm kiếm Dù sao tôi đã upvoted câu trả lời của bạn bởi vì nó có thể hữu ích và cho thời gian của bạn.Cảm ơn :) – gc5

1

Điều quan trọng là phải hiểu rằng nội suy không chỉ là một dòng để hiển thị. Nó là một mô hình toán học đại diện cho cách bạn nghĩ hệ thống hoạt động (hệ thống tạo ra dữ liệu mà bạn đo được). Các loại nội suy khác nhau đại diện cho các giả định khác nhau về hệ thống. Vì vậy, nếu bạn biết rằng hệ thống của bạn là như vậy mà một biến chỉ có thể tăng, bạn nên phù hợp với một mô hình thích hợp (tức là sử dụng nội suy thích hợp). Nhìn vào dữ liệu của bạn, có vẻ như đa thức bậc 2 hoặc hàm mũ có thể phù hợp. A Loess (hồi quy cục bộ) phù hợp cũng sẽ hoạt động. Bạn có thể sử dụng các hàm được thiết kế riêng như numpy.polyfit() hoặc đường cong chung phù hợp với scipy.optimize.curve_fit(). Nếu bạn có thêm kiến ​​thức về hệ thống, bạn nên sử dụng nó để chọn kiểu nào phù hợp.

+0

Tôi biết .. Tôi là một chút nescient trong nội suy, xin lỗi. Tôi đã thử các phụ kiện đa thức nhưng nó không phải là thứ tôi đang tìm kiếm. Dù sao tôi đã upvoted bạn cho thời gian của bạn. Cảm ơn :) – gc5

1

Tôi đã xem xét một chút. Những gì bạn muốn được gọi là

đơn điệu khối nội suy,

xem wikipedia here. Bạn có một cuộc thảo luận về mathexchange về nó here và tôi đã tìm thấy một thực hiện trong python here. Hãy cho tôi biết nếu các công trình này!

+0

Tôi đã thử giải pháp của bạn và nó hoạt động nhưng có một chức năng tương tự trong scipy.interpolate .. Dù sao tôi upvoted câu trả lời của bạn cho nỗ lực của bạn :) Cảm ơn – gc5

Các vấn đề liên quan