最佳拟合线 Matplotlib

最佳拟合线 Matplotlib

参考:best fit line matplotlib

Matplotlib 是一个用于创建可视化图表的 Python 库,它可以用于绘制线图、柱状图、散点图等。在实际应用中,我们经常需要通过数据拟合出一条最佳拟合线,来表示数据的趋势。本文将介绍如何使用 Matplotlib 绘制最佳拟合线。

线性回归

线性回归是一种广泛应用于数据分析中的方法,通过线性方程拟合数据点,得出最佳拟合线。我们可以使用 SciPy 库中的 linregress 函数来获取最佳拟合线的参数。

import numpy as np
from scipy.stats import linregress

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])

slope, intercept, r_value, p_value, std_err = linregress(x, y)

绘制最佳拟合线

通过上面的线性回归,我们得到了最佳拟合线的斜率和截距,接下来就可以将最佳拟合线绘制到图表上。我们可以使用 Matplotlib 的 plot 函数来绘制直线。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='red')
plt.show()

Output:

最佳拟合线 Matplotlib

使用真实数据进行最佳拟合线绘制

以上只是一个简单的示例,下面我们来看一个更加复杂的例子,使用真实数据进行最佳拟合线的绘制。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='green')
plt.show()

Output:

最佳拟合线 Matplotlib

多项式拟合

除了线性回归,我们还可以使用多项式拟合来得到更加复杂的拟合线。我们可以使用 NumPy 库中的 polyfit 函数来进行多项式拟合。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

coefficients = np.polyfit(x, y, 2)
poly = np.poly1d(coefficients)

plt.scatter(x, y)
plt.plot(x, poly(x), color='blue')
plt.show()

Output:

最佳拟合线 Matplotlib

使用真实数据进行多项式拟合

同样地,我们也可以使用真实数据来进行多项式拟合,下面是一个例子:

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 2*x**2 + 3*x + 1 + np.random.normal(0, 1, 100)

coefficients = np.polyfit(x, y, 2)
poly = np.poly1d(coefficients)

plt.scatter(x, y)
plt.plot(x, poly(x), color='purple')
plt.show()

Output:

最佳拟合线 Matplotlib

自定义最佳拟合线

有时候,我们希望对最佳拟合线进行一些自定义,比如改变线条的颜色、线型等。下面是一个例子:

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='orange', linestyle='--')
plt.show()

Output:

最佳拟合线 Matplotlib

绘制置信区间

除了绘制最佳拟合线外,有时候我们还希望在图表上标出拟合线的置信区间。我们可以使用 fill_between 函数来实现这一功能。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='red')

plt.fill_between(x, (slope-std_err)*x + intercept, (slope+std_err)*x + intercept, color='gray', alpha=0.5)
plt.show()

Output:

最佳拟合线 Matplotlib

十字标记最佳拟合线的截距

有时候,我们希望在图表上标出最佳拟合线的截距,这样可以更清晰地展示数据拟合的情况。我们可以使用 annotate 函数来实现这一功能。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='green')

plt.annotate(f'Intercept: {intercept}', (0, intercept), xytext=(1, intercept+1), arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()

Output:

最佳拟合线 Matplotlib

绘制加权最佳拟合线

有时候,我们需要对数据进行加权处理,以减小某些数据点对拟合线的影响。这时候,我们可以使用 linregress 函数的 weights 参数来指定权重。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)
weights = np.random.random(100)

slope, intercept, r_value, p_value, std_err = linregress(x, y, weights=weights)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='blue')
plt.show()

改变拟合线的粗细和透明度

有时候,我们希望改变拟合线的粗细和透明度,以使其更符合我们的需求。我们可以通过 plot 函数的 linewidthalpha 参数来实现这一目的。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y)
plt.plot(x, slope*x + intercept, color='purple', linewidth=2, alpha=0.8)
plt.show()

Output:

最佳拟合线 Matplotlib

绘制多条拟合线

有时候,我们希望同时展示多条拟合线,比较它们的拟合效果。我们可以使用多个 plot 函数来绘制多条拟合线。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y1 = 3*x + 2 + np.random.normal(0, 1, 100)
y2 = -2*x + 5 + np.random.normal(0, 1, 100)

slope1, intercept1, r_value1, p_value1, std_err1 = linregress(x, y1)
slope2, intercept2, r_value2, p_value2, std_err2 = linregress(x, y2)

plt.scatter(x, y1, color='blue')
plt.plot(x, slope1*x + intercept1, color='red')

plt.scatter(x, y2, color='green')
plt.plot(x, slope2*x + intercept2, color='orange')
plt.show()

Output:

最佳拟合线 Matplotlib

使用不同的符号和颜色区分数据点

有时候,我们需要在图表中使用不同的符号和颜色来区分不同的数据点,以帮助观察者更清晰地识别数据。我们可以通过 scatter 函数的 markerc 参数来实现这一目的。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)
color = np.random.random(100)
marker = ['o', 's', '^', 'x'] * 25

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y, c=color, marker=marker)
plt.plot(x, slope*x + intercept, color='purple')
plt.show()

绘制对数坐标轴的最佳拟合线

有时候,数据点的趋势呈现出指数函数的特征,这时候我们可以将坐标轴设置为对数坐标轴,并绘制最佳拟合线。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(1, 10, 100)
y = 2**x + np.random.normal(0, 1, 100)

log_x = np.log(x)
log_y = np.log(y)

slope, intercept, r_value, p_value, std_err = linregress(log_x, log_y)

plt.scatter(x, y)
plt.plot(x, np.exp(intercept) * x**slope, color='blue')
plt.xscale('log')
plt.yscale('log')
plt.show()

Output:

最佳拟合线 Matplotlib

加入图例

最后,为了让图表更加清晰明了,我们可以加入图例,说明每条线代表的含义。我们可以通过 legend 函数来实现这一功能。

import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress

x = np.linspace(0, 10, 100)
y = 3*x + 2 + np.random.normal(0, 1, 100)

slope, intercept, r_value, p_value, std_err = linregress(x, y)

plt.scatter(x, y, label='Data Points')
plt.plot(x, slope*x + intercept, color='purple', label='Best Fit Line')
plt.legend()
plt.show()

Output:

最佳拟合线 Matplotlib

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程