Используйте Seaborn для построения 1D временного ряда в виде линии с маргинальной гистограммой вдоль оси Y - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь воссоздать общие черты следующего рисунка:

enter image description here

(от Е.М. Озбудака, М. Тэттая, И. КурцераА. Д. Гроссман и А. ван Оуденаарден, Nat Genet 31, 69 (2002))

seaborn.jointplot делает большую часть того, что мне нужно, но, похоже, не может использовать строкуграфик, и нет очевидного способа скрыть гистограмму вдоль оси х.Есть ли способ заставить jointplot сделать то, что мне нужно?Кроме этого, есть ли какой-нибудь другой достаточно простой способ создания такого сюжета с использованием Seaborn?

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вот способ создать примерно такой же график, как показано в вопросе.Вы можете разделить оси между двумя вспомогательными участками и сделать соотношение ширины асимметричным.

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

x = np.linspace(0,8, 300)
y = np.tanh(x)+np.random.randn(len(x))*0.08

fig, (ax, axhist) = plt.subplots(ncols=2, sharey=True,
                                 gridspec_kw={"width_ratios" : [3,1], "wspace" : 0})

ax.plot(x,y, color="k")
ax.plot(x,np.tanh(x), color="k")

axhist.hist(y, bins=32, ec="k", fc="none", orientation="horizontal")
axhist.tick_params(axis="y", left=False)

plt.show()

enter image description here

0 голосов
/ 07 декабря 2018

Оказывается, что вы можете создать модифицированный jointplot с необходимыми характеристиками, работая напрямую с базовым JointGrid объектом:

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

x = np.linspace(0,8, 300)
y = (1 - np.exp(-x*5))*.5
ynoise= y + np.random.randn(len(x))*0.08

grid = sns.JointGrid(x, ynoise, ratio=3)
grid.plot_joint(plt.plot)
grid.ax_joint.plot(x, y, c='C0')

plt.sca(grid.ax_marg_y)
sns.distplot(grid.y, kde=False, vertical=True)

# override a bunch of the default JointGrid style options
grid.fig.set_size_inches(10,6)
grid.ax_marg_x.remove()
grid.ax_joint.spines['top'].set_visible(True)

Вывод:

enter image description here

0 голосов
/ 07 декабря 2018

Вы можете использовать ax_marg_x.patches, чтобы повлиять на результат.

Здесь я использую его, чтобы сделать график по оси X белым, чтобы его не было видно (хотя поле для него осталось):

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="white", color_codes=True)

x, y = np.random.multivariate_normal([2, 3], [[0.3, 0], [0,  0.5]], 1000).T
g = sns.jointplot(x=x, y=y, kind="hex", stat_func=None, marginal_kws={'color': 'green'})
plt.setp(g.ax_marg_x.patches, color="w", )

plt.show()

Вывод:

Seaborn Plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...