Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何平滑这条锯齿状numpy多项式拟合线?_Python_Numpy - Fatal编程技术网

Python 如何平滑这条锯齿状numpy多项式拟合线?

Python 如何平滑这条锯齿状numpy多项式拟合线?,python,numpy,Python,Numpy,我想为散点图画一条平滑的多项式拟合线,但是!代码如下: import matplotlib.pyplot as plt import numpy.polynomial.polynomial as poly import pandas as pd x = [] y = [] col_names = ['col1','col2','col3'] for sheet in sheets: df = pd.read_csv(path, names=col_names) x += df[

我想为散点图画一条平滑的多项式拟合线,但是!代码如下:

import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
import pandas as pd

x = []
y = []
col_names = ['col1','col2','col3']
for sheet in sheets:
    df = pd.read_csv(path, names=col_names)
    x += df['col3'].tolist()
    y += df['col2'].tolist()

plt.scatter(x, y, c='k', alpha=0.2)
coefs = poly.polyfit(x, y, 3)
ffit = poly.polyval(x, coefs)
plt.plot(x, ffit)
plt.show()
将拟合度设置为1将绘制一条干净的线,但在这种情况下,它不如曲线多项式拟合线有用。当我只打印一个.csv文件中的数据,而不是添加一组文件中的值时,会显示相同的razor wire纹理


创建锯齿线可能出现了什么问题,可以采取什么措施来修复它?

看起来您的x值到处都是乱七八糟的

如果对这些值进行排序,并对y值应用相同的排序,则会得到更好的拟合

x = numpy.array(x)
y = numpy.array(y)
order = numpy.argsort(x)
x = x[order]
y = y[order]
使用
scipy.optimize.curve_fit()
而不是
numpy.polynomy.polynomy.polyfit()
对某人的评论和链接。根据那里的建议,我做了如下调整:

ffit = poly.polyval(sorted(x), coefs)
plt.plot(sorted(x), ffit)

这就产生了。问题是x值的绘制顺序不正确,形成了锯齿状的图案。运行
poly.polyfit()
后,y值的顺序无关紧要,因此,在运行之后调用x值时对其进行排序可以解决问题。

这是否回答了您的问题?另外,请看一下两者的不同之处(scipy和线形图与numpy散点图),但问题相似,谢谢。我已经修改了他们的建议,并写了一个答案来说明我在这个例子中所做的事情。现在我得到了“TypeError:只有整数标量数组可以转换为标量索引”。起初我认为这是因为x是一个浮点列表,但在将值转换为整数后,我得到了相同的错误。@JosephE我们需要将每个列表转换为一个numpy数组。我已经在我的答案上加了更正。