2017-01-06 4 views
3

Я хотел бы иметь возможность строить несколько наложенных kde-графиков по краю оси y (не нужно иметь график поля оси x). Каждый график kde будет соответствовать цветовой категории (4), так что я бы имел 4 kde, каждый из которых отображал распределение одной из категорий. Это, насколько я получил:seaborn plot_marginals multiple 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 dataframe. Затем вы можете прокручивать каждую уникальную категорию, фильтруя фрейм данных и планируя распределение, используя вызовы 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

Может ли нижестоящий помочь объяснить? Я считаю, что это именно то, что задал ОП. – lanery

+0

Почему вы переписываете функцию seaborn.kdeplot? – mwaskom

+0

@mwaskom, нет веской причины. Я недавно использовал эту функцию для чего-то еще и ненадлежащим образом применил ее здесь. Я думаю, что пересмотренный ответ теперь намного лучше, спасибо. – lanery

Смежные вопросы