2016-06-28 55 views
9

Sto tentando di ricreare la trama segue dal libro Introduzione alla formazione di statistica utilizzando Seaborn enter image description hereTracciare molteplici trame diverse in una figura usando Seaborn

In particolare mi voglio ricreare questo usando del lmplot Seaborn per creare i primi due lotti e boxplot per creare il secondo. Il problema principale è che lmplot crea un in base a to this answer che mi costringe a aggiungere in modo logico altri assi matplotlib per il boxplot. Mi stavo chiedendo se esistesse un modo più semplice per raggiungere questo obiettivo. Sotto, devo fare un bel po 'di manipolazione manuale per ottenere la trama desiderata.

seaborn_grid = sns.lmplot('value', 'wage', col='variable', hue='education', data=df_melt, sharex=False) 
seaborn_grid.fig.set_figwidth(8) 

left, bottom, width, height = seaborn_grid.fig.axes[0]._position.bounds 
left2, bottom2, width2, height2 = seaborn_grid.fig.axes[1]._position.bounds 
left_diff = left2 - left 
seaborn_grid.fig.add_axes((left2 + left_diff, bottom, width, height)) 

sns.boxplot('education', 'wage', data=df_wage, ax = seaborn_grid.fig.axes[2]) 
ax2 = seaborn_grid.fig.axes[2] 
ax2.set_yticklabels([]) 
ax2.set_xticklabels(ax2.get_xmajorticklabels(), rotation=30) 
ax2.set_ylabel('') 
ax2.set_xlabel(''); 

leg = seaborn_grid.fig.legends[0] 
leg.set_bbox_to_anchor([0, .1, 1.5,1]) 

che produce enter image description here

dati di esempio per DataFrames:

df_melt = {'education': {0: '1. < HS Grad', 
    1: '4. College Grad', 
    2: '3. Some College', 
    3: '4. College Grad', 
    4: '2. HS Grad'}, 
'value': {0: 18, 1: 24, 2: 45, 3: 43, 4: 50}, 
'variable': {0: 'age', 1: 'age', 2: 'age', 3: 'age', 4: 'age'}, 
'wage': {0: 75.043154017351497, 
    1: 70.476019646944508, 
    2: 130.982177377461, 
    3: 154.68529299562999, 
    4: 75.043154017351497}} 

df_wage={'education': {0: '1. < HS Grad', 
    1: '4. College Grad', 
    2: '3. Some College', 
    3: '4. College Grad', 
    4: '2. HS Grad'}, 
'wage': {0: 75.043154017351497, 
    1: 70.476019646944508, 
    2: 130.982177377461, 
    3: 154.68529299562999, 
    4: 75.043154017351497}} 
+0

penso che si desidera utilizzare 'PairGrid'. – mwaskom

risposta

18

Una possibilità sarebbe quella di non utilizzare per lmplot(), ma utilizzare direttamente regplot() invece. regplot() stampa sugli assi passati come argomento con ax=.

Si perde la possibilità di dividere automaticamente il set di dati in base a una determinata variabile, ma se si conoscono in anticipo i grafici che si desidera generare, non dovrebbe essere un problema.

Qualcosa di simile a questo:

fig, axs = plt.subplots(ncols=3) 
sns.regplot(x='value', y='wage', data=df_melt, ax=axs[0]) 
sns.regplot(x='value', y='wage', data=df_melt, ax=axs[1]) 
sns.boxplot(x='education',y='wage', data=df_melt, ax=axs[2]) 
+0

Grazie, suppongo che stavo cercando una soluzione più generica che consentisse alla griglia di faccette di incorporare assi extra vuoti per il tracciamento aggiuntivo in futuro. Potrebbe non esserci un modo per farlo con lmplot. –

+6

Dopo un anno di contemplazione, sono d'accordo che questo è il metodo migliore. –

+0

Ha funzionato, ho una domanda correlata, ma non ancora risolta. La prego di dare un'occhiata, non so come scriverti in privato. Thanks.https: //stackoverflow.com/q/48225888/2525479 – StayFoolish