2017-01-06 7 views
3

y軸マージンに複数の重ね合わせたkdeプロットをプロットすることができます(x軸のマージンプロットは必要ありません)。それぞれのkdeプロットは色カテゴリ(4つあります)に対応していますので、4つのkdeのそれぞれのカテゴリの分布を示しています。これは、私の知る限りだとされていますseaborn plot_marginals複数のkdeplots

import numpy as np 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 


%matplotlib inline 
%config InlineBackend.figure_format = 'svg' 



x = [106405611, 107148674, 107151119, 107159869, 107183396, 107229405, 107231917, 107236097, 
107239994, 107259338, 107273842, 107275873, 107281000, 107287770, 106452671, 106471246, 
106478110, 106494135, 106518400, 106539079] 


y = np.array([ 9.09803208, 5.357552 , 8.98868469, 6.84549005, 
     8.17990909, 10.60640521, 9.89935692, 9.24079133, 
     8.97441459, 9.09803208, 10.63753055, 11.82336724, 
     7.93663794, 8.74819285, 8.07146236, 9.82336724, 
     8.4429435 , 10.53332973, 8.23361968, 10.30035256]) 


x1 = pd.Series(x, name="$V$") 
x2 = pd.Series(y, name="$Distance$") 

col = np.array([2, 4, 4, 1, 3, 4, 3, 3, 4, 1, 4, 3, 2, 4, 1, 1, 2, 2, 3, 1]) 

g = sns.JointGrid(x1, x2) 
g = g.plot_joint(plt.scatter, color=col, edgecolor="black", cmap=plt.cm.get_cmap('RdBu', 11)) 
cax = g.fig.add_axes([1, .25, .02, .4]) 
plt.colorbar(cax=cax, ticks=np.linspace(1,11,11)) 
g.plot_marginals(sns.kdeplot, color="black", shade=True) 

enter image description here

答えて

4

を各カテゴリの分布をプロットするために、私は最善の方法は、最初pandasデータフレームにデータを組み合わせることであると思います。次に、データフレームをフィルタリングし、sns.kdeplotへの呼び出しを使用して分布をプロットすることによって、それぞれのユニークなカテゴリをループすることができます。

import numpy as np 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 


x = np.array([106405611, 107148674, 107151119, 107159869, 107183396, 107229405, 
       107231917, 107236097, 107239994, 107259338, 107273842, 107275873, 
       107281000, 107287770, 106452671, 106471246, 106478110, 106494135, 
       106518400, 106539079]) 

y = np.array([9.09803208, 5.357552 , 8.98868469, 6.84549005, 
       8.17990909, 10.60640521, 9.89935692, 9.24079133, 
       8.97441459, 9.09803208, 10.63753055, 11.82336724, 
       7.93663794, 8.74819285, 8.07146236, 9.82336724, 
       8.4429435 , 10.53332973, 8.23361968, 10.30035256]) 

col = np.array([2, 4, 4, 1, 3, 4, 3, 3, 4, 1, 4, 3, 2, 4, 1, 1, 2, 2, 3, 1]) 

# Combine data into DataFrame 
df = pd.DataFrame({'V': x, 'Distance': y, 'col': col}) 

# Define colormap and create corresponding color palette 
cmap = sns.diverging_palette(20, 220, as_cmap=True) 
colors = sns.diverging_palette(20, 220, n=4) 

# Plot data onto seaborn JointGrid 
g = sns.JointGrid('V', 'Distance', data=df, ratio=2) 
g = g.plot_joint(plt.scatter, c=df['col'], edgecolor="black", cmap=cmap) 

# Loop through unique categories and plot individual kdes 
for c in df['col'].unique(): 
    sns.kdeplot(df['Distance'][df['col']==c], ax=g.ax_marg_y, vertical=True, 
       color=colors[c-1], shade=True) 
    sns.kdeplot(df['V'][df['col']==c], ax=g.ax_marg_x, vertical=False, 
       color=colors[c-1], shade=True) 

enter image description here

これは私の意見では、私はこのようにそれを行うには考えていなかったので、私は不seaborn kdeplotを再定義している私の元の答えよりもはるかに優れかつクリーンなソリューションです。それを指摘してくれたmwaskomに感謝します。また、凡例のラベルは、掲載されたソリューションで削除され、使用されていることに注意してください。

g.ax_marg_x.legend_.remove() 
g.ax_marg_y.legend_.remove() 
+0

ダウンボッターの説明に注意してください。私はこれがまさにOPによって尋ねられたものだと信じています。 – lanery

+0

なぜseaborn.kdeplot関数を書き換えていますか? – mwaskom

+0

@mwaskom、まあまあです。私はその機能を最近何か他のものに使用していて、ここでそれを不適切に再適用しました。私は、改訂された答えが今よりずっと良いと思う。 – lanery