2017-02-27 7 views
0

私は現在、MatPlotLibの散布図にトレンドラインプロットをプロットしようとしています。KDEに基づいてscatter-plot matplotlibにトレンドラインをプロットする方法は?

私はnumpyを知っていますpolyfit機能。それは私がしたいことをしません。

だからここに私がこれまでにしたもの:

Scatter-plot with trends

私が欲しいものです::

Scatter-Plot_desired

トレンドでき

plot = plt.figure(figsize=(10,10)) #Set up the size of the figure 

cmap = "viridis" #Set up the color map 

plt.scatter(samples[1], samples[0], s=0.1, c=density_sm, cmap=cmap) #Plot the Cross-Plot 

plt.colorbar().set_label('Density of points') 

plt.axis('scaled') 
plt.xlim(-0.3,0.3) 
plt.ylim(-0.3,0.3) 
plt.xlabel("Intercept") 
plt.ylabel("Gradient") 

plt.axhline(0, color='green', alpha=0.5, linestyle="--") 
plt.axvline(0, color='green', alpha=0.5, linestyle="--") 

#Trend-line_1 
z = np.polyfit(samples[1], samples[0], 1) 
p = np.poly1d(z) 
plt.plot(samples[0],p(samples[0]),color="#CC3333", linewidth=0.5) 

#Trend-line_2 
reg = sm.WLS(samples[0], samples[1]).fit() 
plt.plot(samples[1], reg.fittedvalues) 

そして、ここでは結果は簡単に見ることができますが、質問はwです使用する帽子機能?

+0

期待される結果の代表的なデータセットとイメージを追加できますか? – Nilesh

+0

私のデータセットは約0.5Gbですが、どうすればいいですか? –

+0

この場合、私には 'polyfit'が適切と思われます。たぶんそれは、あなたがそれを使用しない理由について話すのに役立つでしょう。もちろん、データに適合する他のツールもあります。統計パッケージの中で最も簡単なものは[一般最小二乗](http://statsmodels.sourceforge.net/devel/regression.html)です。また、あなたが使用しているツール(あなたがどちらのツールを使用しているのかわからない)も利用可能です。また、['seaborn.regplot'](http://seaborn.pydata.org/generated/seaborn.regplot.html)を使って、自分の身体に関する情報が得られないという明らかな欠点を単純に使うこともできます。 – ImportanceOfBeingErnest

答えて

0

サンプル[0]は「y」、サンプル[1]は「x」です。トレンドラインプロットでは、サンプル[1]を使用します。

+0

私は試しましたが、それは間違った傾向も示しています –

0

polyfitの動作は例外として、結果は正しいです。問題は、polyfitはあなたが期待していることではないということです。すべての(典型的な)フィッティングルーチンは、フィッティングとデータポイントとの間の垂直(y軸)距離を最小限に抑えます。あなたが期待しているように見えるのは、フィットとデータの間のユークリッド距離を最小にすることです。この図の相違点を参照してください。 enter image description here

ここでは、ランダムなデータの事実を示すコードも参照してください。データの線形関係(パラメータa)は、フィットによって回復されるが、ユークリッド適合の場合はそうではないことに留意されたい。したがって、一見外れたフィット感が好まれるはずです。

N = 10000 
a = -1 
b = 0.1 

datax = 0.3*b*np.random.randn(N) 
datay = a*datax+b*np.random.randn(N) 

plot = plt.figure(1,figsize=(10,10)) #Set up the size of the figure 
plot.clf() 

plt.scatter(datax,datay) #Plot the Cross-Plot 

popt = np.polyfit(datax,datay,1) 
print("Result is {0:1.2f} and should be {1:1.2f}".format(popt[-2],a)) 

xplot = np.linspace(-1,1,1000) 

def pol(x,popt): 
    popt = popt[::-1] 
    res = 0 
    for i,p in enumerate(popt): 
     res += p*x**i 
    return res 

plt.plot(xplot,pol(xplot,popt)) 

plt.xlim(-0.3,0.3) 
plt.ylim(-0.3,0.3) 
plt.xlabel("Intercept") 
plt.ylabel("Gradient") 
plt.tight_layout() 
plt.show() 
+0

これは良い答えです、それは私には説明できませんが、私が望むフィットを作る方法=) –

+0

本当にユークリッド距離はそれから最小化される?あなたのポイントは何を表し、フィットから何を学びたいですか? – Jannick

+0

これは、地震データから抽出されたインターセプトとグラディエントです。私がそれを私の傾向に適合させることができれば - 私はさらなる分析のために必要な流動線方程式を持つだろう –

関連する問題