2015-11-01 241 views
0

我有一個文本文件的x和y座標,我用這個程序想要計算一條曲線,但結果是一條直線重複自己 數據分別導入爲x和y座標。這裏是處理這個數據的代碼龜繪製曲線

def plotDots(t,x_acc,y_acc):      
    while x_acc and y_acc: 
     t.pu() 
     t.goto(x_acc[0],y_acc[0]) 
     t.pd() 
     t.stamp() 
     x_acc, y_acc=x_acc[1:], y_acc[1:] 

def plotRegression(x,x_acc,y_acc): 
    ave_x=sum(x_acc)/len(x_acc)      #Calculating curve 
    ave_y=sum(y_acc)/len(y_acc) 
    n=len(x_acc) 
    m=((x_acc[0]*y_acc[0])-(n*ave_x*ave_y))/(x_acc[0]**2-(n-x_acc[0]**2)) 
    y=ave_y+m*(x-ave_x) 
    return y 

def main(): 
    t=turtle.Turtle() 
    wn=turtle.Screen() 
    turtle.setworldcoordinates(-1000,-1000,1000,1000) 
    doc=open("labdata.txt") 
    line=doc.readline() 
    y_acc=[] 
    x_acc=[] 
    while line: 
     values=line.split() 
     x_acc=x_acc +[float(values[0])] 
     y_acc=y_acc +[float(values[1])] 
     line=doc.readline() 
    plotDots(t,x_acc,y_acc) 
    for x in x_acc: 
     t.goto(x, plotRegression(x,x_acc,y_acc)) 

    doc.close() 
    wn.exitonclick() 

main() 
+0

爲什麼不使用'for line in doc'來遍歷行呢? – Evert

回答

1

我讀你的腳本的方式,你正在適應一個線性的數據。然後,您繪製適合,在線性線,因爲plotRegression將返回(在't.goto(...)裝出屬於你輸入x價值y值。
所以這怪不得你看直線;你應該看到

簡單使用

for x, y in zip(x_acc, y_acc): 
    t.goto(x, y) 

畫出你的曲線


。注意:計算一次迴歸更有意義,然後對每個x進行評估。因此,使函數 calcRegression返回 ab,您的擬合參數,然後 evalRegression需要輸入 x(浮點數或浮點數組)並返回 y
我不會調用函數 plotRegression如果它實際上不 陰謀什麼。


如果你打算用這個進行科學計算,你最好用numpy/scipy/pandas進行計算,例如matplotlib繪圖。

如果這只是練習的一部分,沒有問題,但不要將它用於現實世界的問題,因爲人們之前已經解決了這個問題(並且總體上,更仔細和更詳細)。