2016-07-14 58 views
0

この質問に回答したJoe Kingtonの説明のとおり、How can I make a scatter plot colored by density in matplotlibのように、密度で色分けされた散布図を作成しました。しかし、私のデータが複雑に分布しているため、密度の計算に使用するパラメータを変更したいと考えています。ここで は私に似て、いくつかの偽のデータとの結果である: enter image description here 私はので最初のプロットを好きではない: Density plot : Unwanted result プロットの左側の部分は次のようになりますように、私はgaussian_kdeの密度の計算を校正したいと思いますポイントのグループは隣接するポイントのグループの密度に影響し、グループ内の分布を分析できなくなります。つまり、8つのグループのそれぞれがまったく同じ分布を持っていても、それはグラフ上には見えません。matplotlibの密度で色分けされた散布図のgaussian_kdeのパラメータを変更するには

私はcovariance_factorを修正しようとしました(x上の密度の2次元プロットのように)。しかし、複数の次元配列でgaussian_kdeを使うと、 "scipy.stats.kde"ではなくnumpy.ndarrayが返されます。 gaussian_kde "オブジェクトである。さらに、私はcovariance_factorを変更することでそれが実現するかどうかも分かりません。

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import gaussian_kde 

# Generate fake data 
a = np.random.normal(size=1000) 
b = np.random.normal(size=1000) 

# Data for the first image 
x = np.concatenate((a+10,a+10,a+20,a+20,a+30,a+30,a+40,a+40,a+80)) 
y = np.concatenate((b+10,b-10,b+10,b-10,b+10,b-10,b+10,b-10,b*4)) 

# Data for the second image 
#x = np.concatenate((a+10,a+10,a+20,a+20,a+30,a+30,a+40,a+40)) 
#y = np.concatenate((b+10,b-10,b+10,b-10,b+10,b-10,b+10,b-10)) 

# Calculate the point density 
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy) 

# My unsuccesfull try to modify covariance which would work in 1D with "z = gaussian_kde(x)" 
#z.covariance_factor = lambda : 0.01 
#z._compute_covariance() 

# Sort the points by density, so that the densest points are plotted last 
idx = z.argsort() 
x, y, z = x[idx], y[idx], z[idx] 

fig, ax = plt.subplots() 
ax.scatter(x, y, c=z, s=50, edgecolor='') 
plt.show() 

ソリューションは、他の密度の計算機を使用することができ、私は気にしない:

は、ここに私のダミーのコードです。 目標は、上に示したような濃度プロットを作成することです。ここでは、密度パラメータで再生できます。

私はSeabornを見ていました

+0

をあなたが最初のプロットと間違って何より明確に説明してもらえますか?私の推測では、より滑らかでない密度の推定値を望むということです。これは、 'bw_method ='パラメータに異なるスカラー値を渡すなど、ガウスカーネルの帯域幅を変えることである程度制御できます。しかし、KDEは一般的に単峰性のディストリビューションに最適です。あなたのような複雑なマルチモーダルディストリビューションでは、オーバースムージングは​​やや避けられません。 –

+0

1)質問を編集しました。 2)私は、bw_methodパラメータを変更する方法の例に興味があります。 3)配布のアドバイスをありがとう。 – Gab

答えて

1

のpython 3.4.3を使用していますか?それはあなたが求めている正確に何ではないのですが、それはすでに密度プロットを生成するための機能を持っています。

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import kendalltau 
import seaborn as sns 

# Generate fake data 
a = np.random.normal(size=1000) 
b = np.random.normal(size=1000) 

# Data for the first image 
x = np.concatenate((a+10, a+10, a+20, a+20, a+30, a+30, a+40, a+40, a+80)) 
y = np.concatenate((b+10, b-10, b+10, b-10, b+10, b-10, b+10, b-10, b*4)) 

sns.jointplot(x, y, kind="hex", stat_func=kendalltau) 
sns.jointplot(x, y, kind="kde", stat_func=kendalltau) 
plt.show() 

それが与える: HexplotKDEplot

+0

ありがとう、それは私が探しているものではありません(私は個々のドットがゆるいので)、私はそれを試して、代替の解決策としてそれを保つでしょう! – Gab

関連する問題