2014-09-26 8 views
16

Ich versuche, ein Loglog-Diagramm mit einem KDE und Histogramm mit jeder Achse mit einem Seafood JointGrid-Objekt zu erstellen. Das bringt mich ziemlich nahe, aber die Histogramm-Bins lassen sich nicht gut in den Logspace übersetzen. Gibt es eine Möglichkeit, dies einfach zu tun, ohne die Randachsen neu erstellen zu müssen?log-log-plot mit 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

Ich glaube nicht, Sie als näher bekommen, was Sie jetzt haben. Das ist etwas, von dem ich denke, dass 'plotplot' sich selbst besser handhaben sollte, aber ich war vorsichtig, es hinzuzufügen, weil ich nicht sicher bin, was genau die Leute erwarten würden, um den meisten Sinn zu machen. Können Sie sagen, wie die Histogramme aussehen sollten? Balken mit konstanter Breite im Protokollbereich? – mwaskom

+1

Yep - Balken mit konstanter Breite wären fantastisch. Ich weiß, wie man dies mit ax.hist und np.logspace von Hand macht, aber für Seaborn denke ich, ich werde weitermachen und die Daten im DataFrame aufzeichnen und dann 10^x auf die Achsenbeschriftungen anwenden ein Workaround. Als Randbemerkung, ich bin verwirrt, warum die Randachsen nicht nur Einstellung ax = g.ax_joint ax.set_xscale (‚log‘) ax.set_yscale (‚log‘) nicht automatisch eingestellt? Danke für die Antwort, es ist ein tolles Paket! – Koppology

+0

Das ist überraschend. Diese Achsen werden geteilt, wenn Seaborn das 'JointGrid' erstellt, also schlägt es eine Inkonsistenz in Matplotlib vor. – mwaskom

Antwort

12

Für log Histogramme finde ich generell nützlich, um Ihre eigenen Behälter mit np.logspace() einzustellen.

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

Dann setzen nur 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