2017-03-21 33 views
0

這個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() 
+0

你不會真的有一個問題在這裏。究竟哪一部分增加立方趨勢線是你遇到的麻煩?你是否需要計算適合度,還是將兩者合在一起或完全是其他的東西? – Tuffwer

+0

我想繪製一個線性擬合線和一個三次函數 –

+0

我認爲這個現有的問題應該涵蓋您需要添加三維擬合到您的劇情的一切http://stackoverflow.com/questions/18767523/fitting-data-with -numpy – Tuffwer

回答

2

只要使用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() 

enter image description here

+0

這將無法正常工作,因爲polyfit函數會按照與poly1d期望它們相反的順序返回多項式的係數列表。正如我對該問題的評論的鏈接帖子的最佳答案中所述您需要反轉該列表順序,或使用Polynomial函數代替poly1d。 – Tuffwer

+0

@Tuffwer你確定嗎?我把y變成y = x ** 3/5000.0-x/5000.0,只是爲了讓它更復雜一點,我附上了圖。這似乎是正確的擬合,不是嗎? –

+0

嗯,我是......昨晚我花了大約15分鐘閱讀文檔,併發誓這就是我讀的。重新閱讀[polyfit](https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html)和[poly1d](https://docs.scipy.org/doc/numpy/參考/ generated/numpy.poly1d.html)現在雖然看起來命令匹配,我完全錯了。道歉,讓我滿意。 – Tuffwer

相關問題