2014-09-26 12 views
16

Próbuję utworzyć wykres loglog z KDE i histogramem związanym z każdej osi przy użyciu Seaborn obiektu JointGrid. Daje mi to dość blisko, ale pojemniki histogramu nie przekładają się na logspace. Czy jest jakiś sposób na zrobienie tego z łatwością bez konieczności ponownego tworzenia marginalnych osi?dział log-log z 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

Nie sądzę dostaniesz bliżej niż to, co masz teraz. To jest coś, co moim zdaniem "jointplot" powinien sobie lepiej poradzić, ale byłem ostrożny, aby go dodać, ponieważ nie jestem pewien, czego ludzie oczekują, aby to miało największy sens. Czy możesz powiedzieć, jak chcesz wyglądać histogram? Paski o stałej szerokości w obszarze dziennika? – mwaskom

+1

Tak - paski o stałej szerokości byłyby fantastyczne. Wiem, jak to zrobić za pomocą ax.hist i np.logspace ręcznie, ale do użytku z seabornem Myślę, że mam zamiar iść do przodu i rejestrować dane w DataFrame, a następnie zastosować 10^x do etykiet osi później jako obejście. Na marginesie, jestem zdezorientowany, dlaczego po prostu ustawienie Ax = g.ax_joint ax.set_xscale („log”) ax.set_yscale („log”) nie ustawia automatycznie marginalne osie? Dzięki za odpowiedź, to świetny pakiet! – Koppology

+0

To zaskakujące. Osie te są udostępniane, gdy seaborn tworzy "JointGrid", więc sugeruje niespójność w matplotlib. – mwaskom

Odpowiedz

12

Dla histogramów dziennika znajdę ogólnie przydatny do ustawiania własnych pojemników z np.logspace().

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

Następnie wystarczy ustawić bins= w _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