我正在尝试将三次函数添加到图形而不是线性趋势线

Posted

技术标签:

【中文标题】我正在尝试将三次函数添加到图形而不是线性趋势线【英文标题】:I am trying to add a cubic function to a graph instead of a linear trend line 【发布时间】:2017-08-12 12:52:42 【问题描述】:

x 和 y 是数据列表,可以用线性趋势线很好地绘制。 我还想添加一条三次趋势线。

import matplotlib.pyplot as plt
x = (distanceList)
y = (percentCopper)
plt.scatter(x,y) 
title = "trendLine"
xLabel = "Distance m"
yLabel = "percent copper"
plt.title (title, fontsize=10);
plt.ylabel(yLabel, fontsize=10);
plt.xlabel(xLabel, fontsize=10);
fit = np.polyfit(x,y,1)
fit_fn = np.poly1d(fit) 
plt.plot(x, y, '.', x, fit_fn(x), 'r')
plt.xlim(0, 50)
plt.ylim(0, 2.5)
plt.show()

【问题讨论】:

您实际上没有问题。您在添加三次趋势线的哪个部分遇到问题?您需要计算拟合,还是将两者拟合在一起或完全绘制其他内容? 我想绘制一条线性拟合线和一个三次函数 我认为这个现有问题应该涵盖将三次拟合添加到情节***.com/questions/18767523/fitting-data-with-numpy 【参考方案1】:

只需使用np.polyfit(x,y,3) 并将其添加到绘图中,如下面的代码所示:

import matplotlib.pyplot as plt
import numpy as np
x = np.array(range(50))
y = x**3/5000.0-x/5000.0
plt.scatter(x,y) 
title = "trendLine"
xLabel = "Distance m"
yLabel = "percent copper"
plt.title (title, fontsize=10);
plt.ylabel(yLabel, fontsize=10);
plt.xlabel(xLabel, fontsize=10);
fit = np.polyfit(x,y,1)
fit3 = np.polyfit(x,y,3)
fit_fn = np.poly1d(fit) 
fit_fn3 = np.poly1d(fit3)
plt.plot(x, y, '.', x, fit_fn(x), fit_fn3(x), 'r')
plt.xlim(0, 50)
plt.ylim(0, 2.5)
plt.show()

【讨论】:

这将无法正常工作,因为 polyfit 函数以 poly1d 期望它们的相反顺序将系数列表返回到多项式。如链接帖子的顶部答案中所述我对您需要反转该列表顺序或使用多项式函数而不是 poly1d 的问题的评论。 @Tuffwer 你确定吗?我将 y 切换为 y = x**3/5000.0-x/5000.0 只是为了让它更复杂一些,并附上情节。看起来很合适,不是吗? 嗯,我是……我昨晚花了大约 15 分钟阅读文档,我发誓这就是我阅读的内容。现在重新阅读polyfit 和poly1d,虽然看起来订单确实匹配,但我完全错了。抱歉,请投我一票。

以上是关于我正在尝试将三次函数添加到图形而不是线性趋势线的主要内容,如果未能解决你的问题,请参考以下文章

散点图怎么添加标准差和斜率(散点图怎么添加趋势线)

趋势拟合实现分析

以编程方式将文本注释添加到图形

同一组数据在Excel中分别画散点图和折线图,在做线性处理(添加趋势线),为啥得出的结果(斜率)不一样

使用 UIBezierPath 绘制图形曲线

如何在 grafana 图表中创建趋势线