2015-11-01 129 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绘图。

如果这只是练习的一部分,没有问题,但不要将它用于现实世界的问题,因为人们之前已经解决了这个问题(并且总体上,更仔细和更详细)。