2014-09-26 45 views
16

我正在尝试创建一个使用seaborn JointGrid对象与每个轴关联的KDE和直方图的loglog图。这让我非常接近,但直方图框不能很好地转换成日志空间。有没有办法轻松做到这一点,而无需重新创建边缘轴?用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

我不认为你会得到任何比你现在有什么更接近设定bins=。这是我认为'jointplot'应该更好地处理的事情,但是我一直很谨慎地补充它,因为我不确定人们期望什么最有意义。你能说出你更喜​​欢直方图的样子吗?日志空间中的等宽条? – mwaskom 2014-09-26 14:45:01

+1

是的 - 恒定宽度的酒吧将是太棒了。我知道如何使用ax.hist和np.logspace来手动执行此操作,但为了与seaborn一起使用,我想我会继续并在DataFrame中记录数据,然后将10^x应用于轴标签解决方法。作为一个方面说明,我很困惑,为什么只设置 AX = g.ax_joint ax.set_xscale(“登录”) ax.set_yscale(“登录”) 不会自动设置边际轴?谢谢你的回应,这是一个很棒的包! – Koppology 2014-09-26 15:54:19

+0

这是令人惊讶的。这些坐标轴在seaborn设置'JointGrid'时共享,因此它暗示了matplotlib中的不一致性。 – mwaskom 2014-09-26 17:15:21

回答

12

日志直方图,我觉得一般有用与np.logspace()设置自己的垃圾桶。

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

然后,只需在_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