如何将趋势线添加到散点图

问题描述 投票:0回答:3

如何将趋势线添加到使用

matplotlib.scatter
绘制的点图中?

python numpy matplotlib scatter-plot trendline
3个回答
107
投票

此处解释

在 numpy 的帮助下,可以计算线性拟合等。

# plot the data itself
pylab.plot(x,y,'o')

# calc the trendline
z = numpy.polyfit(x, y, 1)
p = numpy.poly1d(z)
pylab.plot(x,p(x),"r--")
# the line equation:
print "y=%.6fx+(%.6f)"%(z[0],z[1])

3
投票

散点图的趋势线是简单回归线。

seaborn
库有一个函数 (
regplot
),可以在一次函数调用中完成此操作。您甚至可以绘制置信区间(使用
ci=
;我在下图中将其关闭)。

import seaborn as sns
sns.regplot(x=x_data, y=y_data, ci=False, line_kws={'color':'red'});

上述调用为以下数据集生成以下图:

import numpy as np
x_data, y_data = np.repeat(np.linspace(0, 9, 100)[None,:], 2, axis=0) + np.random.rand(2, 100)*2

res

如果您使用的是子图,您也可以通过

ax=

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1,2, figsize=(12,3))
axs[0].scatter(x_data, y_data)
sns.regplot(x=x_data, y=y_data, ci=False, line_kws={'color':'red'}, ax=axs[1]);

res2


简单回归系数具有封闭式解,因此您还可以显式求解它们并绘制回归线和散点图。

如果

x_data
y_data
是列表:

x_mean = sum(x_data) / len(x_data)
y_mean = sum(y_data) / len(y_data)
covar = sum((xi - x_mean) * (yi - y_mean) for xi, yi in zip(x_data, y_data))
x_var = sum((xi - x_mean)**2 for xi in x_data)
beta = covar / x_var
alpha = y_mean - beta * x_mean
y_hat = [alpha + beta * xi for xi in x_data]

如果

x_data
y_data
是 numpy 数组:

x_mean, y_mean = np.mean(x_data), np.mean(y_data)
beta = np.sum((x_data - x_mean) * (y_data - y_mean)) / np.sum((x_data - x_mean)**2)
alpha = y_mean - beta * x_mean
y_hat = alpha + beta * x_data

然后画出两个图:

import matplotlib.pyplot as plt
plt.plot(x_data, y_data, 'bo', x_data, y_hat, "r-");

0
投票

您能告诉我如何在趋势线上添加两条平行线吗?喜欢看到一条虚线平行线,表示与趋势线相差 +/- 10%,或者可能与趋势线相差 +/- 2 点(不平行于 x 轴或 y 轴,但平行于趋势线)。

© www.soinside.com 2019 - 2024. All rights reserved.