我有兩個向量的數據,我把它們放到了matplotlib.scatter()
。現在我想對這些數據進行線性擬合。我將如何做到這一點?我試過使用scikitlearn
和np.scatter
。如何重疊繪製python散點圖上的一條線?
33
A
回答
64
import numpy as np
import matplotlib.pyplot as plt
# sample data
x = np.arange(10)
y = 5*x + 10
# fit with np.polyfit
m, b = np.polyfit(x, y, 1)
plt.plot(x, y, '.')
plt.plot(x, m*x + b, '-')
19
我偏愛scikits.statsmodels。下面一個例子:
import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(100)
Y = X + np.random.rand(100)*0.1
results = sm.OLS(Y,sm.add_constant(X)).fit()
print results.summary()
plt.scatter(X,Y)
X_plot = np.linspace(0,1,100)
plt.plot(X_plot, X_plot*results.params[0] + results.params[1])
plt.show()
唯一棘手的部分是sm.add_constant(X)
它增加了那些以X
的列,以獲得截距項。
Summary of Regression Results
=======================================
| Dependent Variable: ['y']|
| Model: OLS|
| Method: Least Squares|
| Date: Sat, 28 Sep 2013|
| Time: 09:22:59|
| # obs: 100.0|
| Df residuals: 98.0|
| Df model: 1.0|
==============================================================================
| coefficient std. error t-statistic prob. |
------------------------------------------------------------------------------
| x1 1.007 0.008466 118.9032 0.0000 |
| const 0.05165 0.005138 10.0515 0.0000 |
==============================================================================
| Models stats Residual stats |
------------------------------------------------------------------------------
| R-squared: 0.9931 Durbin-Watson: 1.484 |
| Adjusted R-squared: 0.9930 Omnibus: 12.16 |
| F-statistic: 1.414e+04 Prob(Omnibus): 0.002294 |
| Prob (F-statistic): 9.137e-108 JB: 0.6818 |
| Log likelihood: 223.8 Prob(JB): 0.7111 |
| AIC criterion: -443.7 Skew: -0.2064 |
| BIC criterion: -438.5 Kurtosis: 2.048 |
------------------------------------------------------------------------------
8
另一種方式來做到這一點,利用axes.get_xlim()
:
import matplotlib.pyplot as plt
import numpy as np
def scatter_plot_with_correlation_line(x, y, graph_filepath):
'''
http://stackoverflow.com/a/34571821/395857
x does not have to be ordered.
'''
# Scatter plot
plt.scatter(x, y)
# Add correlation line
axes = plt.gca()
m, b = np.polyfit(x, y, 1)
X_plot = np.linspace(axes.get_xlim()[0],axes.get_xlim()[1],100)
plt.plot(X_plot, m*X_plot + b, '-')
# Save figure
plt.savefig(graph_filepath, dpi=300, format='png', bbox_inches='tight')
def main():
# Data
x = np.random.rand(100)
y = x + np.random.rand(100)*0.1
# Plot
scatter_plot_with_correlation_line(x, y, 'scatter_plot.png')
if __name__ == "__main__":
main()
#cProfile.run('main()') # if you want to do some profiling
9
的this excellent answer的單行版本繪製最佳擬合線是:
plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)))
使用np.unique(x)
而不是x
可處理x
未排序或具有重複值的情況。
致電poly1d
是寫出m*x + b
的替代方法,如this other excellent answer。
+1
嗨,我的x和y值是使用'numpy.asarray'從列表轉換而來的數組。當我添加這行代碼時,我會在散點圖上看到幾行而不是一行。可能是什麼原因? – artre
+1
@artre感謝您提出這個問題。如果'x'沒有排序或者具有重複值,可能會發生這種情況。我編輯了答案。 –
2
plt.plot(X_plot, X_plot*results.params[0] + results.params[1])
與
plt.plot(X_plot, X_plot*results.params[1] + results.params[0])
14
相關問題
- 1. python散點圖繪製線
- 2. 如何在向散點圖添加一條線時防止繪製重疊座標軸?
- 3. 如何在散點圖內繪製線條
- 4. 如何可以繪製單個線條到散點圖?
- 5. 如何使用底圖Python在背景上繪製散點圖
- 6. 如何在R中的相同散點圖上繪製多條迴歸線?
- 7. 線條不被繪製在重疊視圖上
- 8. 在Python散點圖上繪製等勢線
- 9. 如何在谷歌地圖上繪製線條疊加Android
- 10. 繪製重疊的列或條形圖
- 11. 如何在圖表上繪製線條?
- 12. 如何在iPad上繪製線條圖?
- 13. 散景重疊條形圖?
- 14. 如何在圖表上點擊事件來繪製高線圖上的線條?
- 15. 通過圖像python的兩點繪製一條線matplotlib
- 16. Python matplotlib疊加散點圖
- 17. 如何在散點圖上整齊地疊加線圖系列?
- 18. 散點圖不上繪製底圖
- 19. 用python繪製三維散點圖?
- 20. 在同一窗口中繪製多種類型的圖(線,散點圖,條等)
- 21. 在地圖上繪製一條線
- 22. 在c#圖上繪製一條線
- 23. 在svg圖片上繪製一條線
- 24. 如何用兩條斜線繪製一條線使用python
- 25. 在散點上疊加一條紅色曲線
- 26. 如何繪製八度散點圖頂部的計數曲線
- 27. MATLAB-如何繪製散點圖矩陣
- 28. 我如何繪製/重繪一條線從主視圖到iPhone的子視圖?
- 29. 識別散點圖中的重疊點
- 30. ggplot如何分散繪製一列和線繪製另一個
我看起來身材不同;線路在錯誤的地方;高於 – David
@David:params數組繞錯了方向。試試: plt.plot(X_plot,X_plot * results.params [1] + results.params [0])。或者,甚至更好:作爲第一個公式假設y是線性的plt.plot(X,results.fittedvalues)是x,儘管在這裏並不總是這樣。 – Ian