使用Seaborn将一维时间序列绘制为沿y轴具有边际直方图的线

时间:2018-12-07 13:13:49

标签: python matplotlib seaborn

我正在尝试重新创建下图的主要功能:

enter image description here

(摘自E.M. Ozbudak,M。Thattai,I。Kurtser,A.D。Grossman和A. van Oudenaarden,Nat Genet 31,69(2002))

seaborn.jointplot满足了我的大部分需求,但似乎无法使用折线图,也没有明显的方法可以沿x轴隐藏直方图。有没有办法让jointplot做我需要的事情?除此以外,还有其他合理简单的方法可以使用Seaborn创建这种情节吗?

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

这是一种创建与问题中所示大致相同的图的方法。您可以在两个子图之间共享轴,并使宽度比不对称。

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

答案 2 :(得分:1)

事实证明,您可以通过直接与基础JointGrid对象一起工作来产生具有所需特征的修改后的jointplot

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