логарифмический участок с морской сеткой

Я пытаюсь создать график журнала с KDE и гистограммой, связанной с каждой осью, с использованием морского объекта 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')

Вывод графика


person Koppology    schedule 26.09.2014    source источник
comment
Я не думаю, что вы станете ближе, чем сейчас. Это то, с чем, я думаю, jointplot должен справиться лучше сам, но я с осторожностью добавляю его, потому что не уверен, что именно люди ожидают, что это будет иметь наибольший смысл. Можете ли вы сказать, как бы вы хотели, чтобы гистограммы выглядели? Полосы постоянной ширины в пространстве журнала?   -  person mwaskom    schedule 26.09.2014
comment
Да, полосы постоянной ширины были бы просто фантастическими. Я знаю, как сделать это с помощью ax.hist и np.logspace вручную, но для использования с seaborn я думаю, что я собираюсь пойти дальше и зарегистрировать данные в DataFrame, а затем применить 10 ^ x к меткам оси после этого как обходной путь. В качестве примечания, я смущен тем, почему просто установка ax = g.ax_joint ax.set_xscale('log') ax.set_yscale('log') автоматически не устанавливает предельные оси? Спасибо за ответ, отличная упаковка!   -  person Koppology    schedule 26.09.2014
comment
Это удивительно. Эти оси являются общими, когда Seaborn устанавливает JointGrid, поэтому это предполагает несоответствие в matplotlib.   -  person mwaskom    schedule 26.09.2014


Ответы (1)


Для гистограмм журналов я считаю полезным устанавливать свои собственные ячейки с помощью np.logspace().

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

Затем просто установите bins= в _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')

введите здесь описание изображения

person lalmei    schedule 19.03.2015
comment
Более новые версии Seaborn позволяют сделать это без вызова logspace, например: g.plot_marginals(sns.histplot, log_scale=True, bins=100, kde=True) - person roman; 17.05.2021