2017-07-16 8 views
1

私は、私がトレンドラインを描画したいと思っているPythonの散布図を持っています。代わりに、曲線であることのPython散布図とmatplotlib

import matplotlib.pyplot as plt 
import numpy as np 

x=np.array([9.80,13.20,13.46,14.09,13.96,10.77,8.79,8.61,8.83,11.08,10.13,12.40,9.90,10.96,12.75,11.79,11.79,12.38,12.78,13.08,12.83,12.57,12.96,12.90,12.91,13.67,12.83,12.50,12.42,12.83,12.82,12.70,12.60,12.90,13.20]) 
y=np.array([0.0706,0.0969,0.0997,0.1031,0.0848,0.1044,0.0815,0.1030,0.0783,0.0970,0.1193,0.0796,0.0697,0.0738,0.0895,0.0912,0.0887,0.0973,0.0942,0.1052,0.0984,0.0965,0.0903,0.0876,0.1071,0.0872,0.0857,0.0967,0.0926,0.0837,0.0967,0.0935,0.0946,0.0930,0.0758 
]) 

plt.scatter(x, y) 
fit = np.polyfit(x, y, deg=4) 
p = np.poly1d(fit) 
plt.plot(x,p(x),"r--") 
plt.show() 

しかし、結果ラインラインのちょうどミックスです:さまざまな例から私は私のコードは次のようにあるトレンドラインを描画する方法を学ぶためにインターネットを中心に発見しました。誰も私の間違いを説明できますか?

答えて

2

xの値はソートされていないためだと思います。このコードを見てください:

import matplotlib.pyplot as plt 
import numpy as np 

x=np.array([9.80,13.20,13.46,14.09,13.96,10.77,8.79,8.61,8.83,11.08,10.13,12.40,9.90,10.96,12.75,11.79,11.79,12.38,12.78, 
      13.08,12.83,12.57,12.96,12.90,12.91,13.67,12.83,12.50,12.42,12.83,12.82,12.70,12.60,12.90,13.20]) 

y=np.array([0.0706,0.0969,0.0997,0.1031,0.0848,0.1044,0.0815,0.1030,0.0783,0.0970,0.1193,0.0796,0.0697,0.0738, 
      0.0895,0.0912,0.0887,0.0973,0.0942,0.1052,0.0984,0.0965,0.0903,0.0876,0.1071,0.0872,0.0857,0.0967,0.0926,0.0837,0.0967,0.0935,0.0946,0.0930,0.0758 ]) 

# Here I sort x values and their corresponding y values 
args = np.argsort(x) 
x = x[args] 
y = y[args] 

plt.scatter(x, y) 
fit = np.polyfit(x, y, deg=4) 
p = np.poly1d(fit) 
plt.plot(x,p(x),"r--") 
plt.show() 

結果:これがどうなる

enter image description here

+1

本当にありがとうございます!私は学習のために行くために長い道のりを持っていることがわかります... – pma

1

plt.scatter(x,y) 
x = sorted(x) 
plt.plot(x,p(x),"r--") 

enter image description here

をトリックはオーバーラインをプロットする前にx値をソートすることですそれら。

+0

あなたの応答のためにおもちゃにこんなに感謝します。 – pma