2017-02-23 1410 views
0

嘗試使用curve_fit將sin函數擬合到這裏的某些點。當繪製適合度和點數時,我會得到一些我不知道如何解釋的東西,所以我最好張貼一些圖像。Python點之間的點連線問題

使用下面的代碼行收益率:

plt.plot(phase_min, sinusoidal_function(phase_min, *popt), '.', lw=3) 

使用線型 ' - ',我得到:

如何我只是有一個該死連線每個相鄰的點,而不是所有的點之間? 謝謝!

+0

你是否對'phase_min'進行了排序? –

+0

我不認爲我需要。 phase_min從已分類的階段開始。我想它繼承了行爲? (Py初學者在這裏) – nyw

+1

我不認爲它已經排序。你可以打印出來並檢查。在曲線擬合之後,您不需要將擬合曲線與原始變量值進行比較,您應該爲要繪製的範圍製作x值。試試像這樣:'x = np.arange(0,1,0.001),y = sinusoidal_function(x,* popt),plt.plot(x,y)' –

回答

1

你可以使用np.argsort

order = np.argsort(x) 
xsorted = x[order] 
ysorted = y[order] 

其中xy是你的橙色點的座標。

+0

我不知道我明白。排序phase_min讓我有點奇怪 http://imgur.com/a/yrEbx – nyw

+0

訣竅是_rearranging_'x'和'y'在一起。如果你只對兩個中的一個進行排序,那麼你正在分離座標對,並且有些奇怪。嘗試對'phase_min'進行排序,然後將正弦函數應用於已排序的'phase_min',並將排序後的東西用於圖中的兩個數據參數。 –

+0

我只是使用phase_min.sort(),並在評論上方的鏈接中找到了圖。 – nyw

1

當您在matplotlib中繪製一條線時,它會按照它們提供的順序自動連接這些點。看下面的例子:

import matplotlib.pyplot as plt 
plt.plot([1,3,2], [1,2,3]) 

enter image description here

你的問題是,你的phase_min未排序和matplotlib試圖以連接數據點。實際上,由於您已經獲得了擬合函數,因此您不需要使用原始數據來繪製函數。您可以按如下所示定義要繪製線條的數據點。通過這種方式,您可以獲得儘可能多的數據點,因此與使用原始數據點繪製圖表相比,該線條會更平滑。

x=np.arange(0, 1, 0.001) 
y=sinusoidal_function(x, *popt) 
plt.plot(x,y) 
+0

哦,現在我看到:)這是有道理的。我不明白的是爲什麼如果我排序phase_min,我仍然得到奇怪的結果。這應該照顧到點到點的連接,並且一切都應該按順序進行。我錯了嗎? – nyw

+0

@nyw您是否在擬合過程之前或之後對'phase_min'進行排序?如果您在擬合之前進行排序,那麼您必須確保'phase_min'和'y'值之間的對應關係保持不變。所以你應該只在配合過程之後排序,然後再製作情節。儘管如此,上面顯示的方法應該是優選的。 –