2014-09-26 2 views
16

Sto provando a creare un grafico di loglog con un KDE e un istogramma associato a ciascun asse utilizzando un oggetto JointGrid nato in mare. Questo mi avvicina molto, ma i contenitori degli istogrammi non si traducono bene in logspace. C'è un modo per farlo facilmente senza dover ricreare gli assi marginali?trama di log-log con seaborn jointgrid

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

data = sns.load_dataset('tips') 
g = sns.JointGrid('total_bill', 'tip', data) 
g.plot_marginals(sns.distplot, hist=True, kde=True, color='blue') 
g.plot_joint(plt.scatter, color='black', edgecolor='black') 
ax = g.ax_joint 
ax.set_xscale('log') 
ax.set_yscale('log') 
g.ax_marg_x.set_xscale('log') 
g.ax_marg_y.set_yscale('log') 

Output of plot

+0

Non credo che si otterrà più vicino di quello che hai ora. Questo è qualcosa che penso che 'jointplot' dovrebbe gestire meglio se stesso, ma sono stato cauto nell'aggiungerlo perché non sono sicuro di quello che le persone si aspettano di avere più senso. Puoi dire come preferiresti gli istogrammi? Barre a larghezza costante nello spazio log? – mwaskom

+1

Sì, le barre a larghezza costante sarebbero fantastiche. So come farlo usando ax.hist e np.logspace a mano, ma per l'uso con seaborn penso che avrò intenzione di registrare i dati nel DataFrame e quindi applicare 10^x alle etichette degli assi in seguito come una soluzione. Come nota a margine, sono confusa sul motivo per cui solo l'impostazione ax = g.ax_joint ax.set_xscale ('log') ax.set_yscale ('log') non imposta automaticamente gli assi marginali? Grazie per la risposta, è un ottimo pacchetto! – Koppology

+0

Questo è sorprendente. Questi assi sono condivisi quando seaborn imposta il 'JointGrid', quindi suggerisce un'incoerenza in matplotlib. – mwaskom

risposta

12

Per gli istogrammi di registro trovo generalmente utile per impostare i propri bidoni con np.logspace().

mybins=np.logspace(0,np.log(100),100) 

Poi basta impostare bins= in _marginals

data = sns.load_dataset('tips') 
g = sns.JointGrid('total_bill', 'tip', data,xlim=[1,100],ylim=[0.01,100]) 
g.plot_marginals(sns.distplot, hist=True, kde=True, color='blue',bins=mybins) 
g.plot_joint(plt.scatter, color='black', edgecolor='black') 
ax = g.ax_joint 
ax.set_xscale('log') 
ax.set_yscale('log') 
g.ax_marg_x.set_xscale('log') 
g.ax_marg_y.set_yscale('log') 

enter image description here