如何用scipy模块 - python显示线性趋势线的方程

时间:2017-03-23 19:21:38

标签: python numpy matplotlib scipy

亲爱的Stackoverflow用户,

如何使用python模块scipy显示趋势线的等式? 考虑到可能无法轻易做到这一点。如何计算斜率和交点,以便我自己编程?

图1:测量尚未知的噪音颜色

import pandas as pd
import matplotlib.pyplot as plt
import TISTNplot as tn
import numpy as np
from scipy import optimize

path = "removed for privacy reasons"
metingen = ['A', 'B', 'C', 'D', 'E', 'F']

"""
Gebruikte kleurcodes behorende bij de geluidskleur
"""
blauw = '#0066ff'   # 3dB/octaaf
grijs = '#cbcbcb'   # a-weging
roze = '#ff66cc'    # -3dB/octaaf
bruin = '#663300'   # -6dB/octaaf
violet = '#9900ff'  # 6dB/octaaf
wit = '#aa0000'     # 0dB/octaaf
zwart = '#000000'

kleur = [blauw, roze, bruin, grijs, violet, wit]

i = 0
meting = metingen[i]
df = pd.read_csv(path+meting+'.txt', sep='\t', header=None, names=['freq', 'intense'], decimal=",")

x = df['freq']
y = df['intense']
x1 = x[df['freq'] < 11][df['freq'] > 8]
y1 = y[df['freq'] < 11][df['freq'] > 8]

print(x1)

plt.plot(x, y, '.', label="Bestand: %s" % metingen[i], color=kleur[i], ms=2)
plt.plot(x1, y1, '.', label="Bestand: %s" % metingen[i], color=kleur[i], ms=5)

"""
Functie voor de trendlijn.
In dit geval een lineaire lijn.
"""
def theorie(x, a, b):
    """ x moet een np.array zijn """
    return a*x+b

params = [0, 2]  # begin waarde voor de fit

params, covariance = optimize.curve_fit(theorie, x1, y1, params)
plt.plot(x, theorie(x, *params), '-b', label='trendlijn', color='red')


"""
Zorgt voor de correcte opmaak
"""
tn.PRECISION_X = 5
tn.PRECISION_Y = 5
tn.fix_axis(plt.gca())
plt.tight_layout()
plt.legend(loc=0)
#plt.xlim(8, 13)
plt.grid()
plt.show()

您正在看到读取数据文件的代码。数据在8-11 x轴范围之外具有很大的不确定性。这就是趋势线适合该区域的原因。

我很乐意收到有关此问题的任何反馈。

亲切的问候

2 个答案:

答案 0 :(得分:0)

您可以使用np.polyfit()将数据拟合到一行(请参阅here)。线性趋势线将是二次多项式(y = mx + b)。这将返回一个带有多项式系数的numpy数组,您可以使用np.linspace()np.poly1d()在matplotlib中创建一个numpy数组和绘图,就像您绘制上面的其他两行一样。提供的链接中有更多详细信息。

答案 1 :(得分:0)

问题已经解决了!

params, covariance = optimize.curve_fit(lineair, x1, y1, params)

params返回斜率和交点。