seaborn 中具有边际概率分布的散点图矩阵

scatterplot matrix with marginal probability distributions in seaborn

使用 seaborn 绘制散点图矩阵很简单 pairplot. Jointplot 还允许将散点图与边际概率分布结合起来用于单个图。

虽然选项 diag_kind='kde' 可以让你在对角线上绘制概率分布(当 x_varsy_vars 相同时很有用)我想将两者结合起来以获得边际概率分布在矩阵散点图中。像这样:

如何在 seaborn 的矩阵散点图中获得边际概率分布,如我上面的屏幕截图所示?

非常感谢mwaskom的指导。

按照您的建议,我构建了自己的 matplotlib 图,并在 this piece 文档的指导下绘制了 seaborn 图。

def basic_conf(f,a,xin,yin,x,y):
   ax = f.add_subplot(a)
   ax.tick_params(axis='both', which='major', labelsize=10)
   ax.spines["right"].set_visible(False)
   ax.spines["top"].set_visible(False)
   if xin !=0:
       ax.set_yticklabels([])
       ax.set_ylabel(" ",fontsize=0).set_visible(False)
   ax.set_ylabel(y,fontsize=10)
   ax.set_xticklabels([])
   ax.set_xlabel(" ",fontsize=0).set_visible(False)

   return ax
def xhist_conf(f,a,x):
   ax = f.add_subplot(a)  
   ax.spines["right"].set_visible(False)
   ax.spines["left"].set_visible(False)
   ax.spines["top"].set_visible(False)
   ax.set_yticklabels([])
   ax.yaxis.set_ticks_position('none')
   ax.set_xlabel(x,fontsize=10)
   ax.set_ylabel(" ").set_visible(False)#,fontsize='xx-small'
   return ax

def yhist_conf(f,a,y):
    ax = f.add_subplot(a)
    ax.tick_params(axis='both', which='major', labelsize=10)
    ax.spines["right"].set_visible(False)
    ax.spines["top"].set_visible(False)
    ax.spines["bottom"].set_visible(False)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.xaxis.set_ticks_position('none')
    ax.set_xlabel(" ",fontsize='xx-small').set_visible(False)
    ax.set_ylabel(" ",fontsize=0).set_visible(False)
    return ax

def includer(ax,x,y):
    r,_=stats.pearsonr(concat_convert[x],concat_convert[y])
    ax.text(0.1, 0.9, f'ρ = {r:.2f}', transform=ax.transAxes)#,fontsize='xx-small'


x_vars=["$P_{LA}$", "$R^{Ao}_P$", "$C^{Ao}_P$", "$R^{Ao}_S$", "$B_{VAD}$", "$A_{VAD}$", "HR", "EF"]
y_vars=["${Q}^{avg}_{M}$", "${Q}^{max}_{M}$","${Q}^{avg}_{Ao}$", "${Q}^{max}_{Ao}$", "${Q}^{avg}_{VAD}$", "${Q}^{max}_{VAD}$", "$Q_{RAT}$"]


sns.set(context="paper",font_scale=1.75,style="ticks")


f = plt.figure(figsize=(18, 16), dpi=600)
gs = f.add_gridspec(8, 9)
plt.rcParams['font.size'] = '10'
plt.rcParams['xtick.labelsize']='8'

with sns.axes_style("ticks"):
    xin=0
    for x in x_vars:
        yin=0
        for y in y_vars:
            ax = basic_conf(f,gs[yin,xin],xin,yin,x,y)
            sns.regplot(ax=ax, data=concat_convert, x=x, y=y, scatter_kws={'s':4})
            includer(ax,x,y)
            yin=yin+1
        xin=xin+1

    xin=0
    for x in x_vars:
        ax = xhist_conf(f,gs[yin,xin],x)
        sns.histplot(ax=ax, data=concat_convert, x=x, kde=True)
        xin=xin+1
    yin=0
    for y in y_vars:
        ax = yhist_conf(f,gs[yin,xin],y)
        sns.histplot(ax=ax, data=concat_convert, y=y, kde=True)
        yin=yin+1

for i in range(len(y_vars)):
    ax = f.add_subplot(gs[i,2])
    ax.set_xlim((0.001,0.0014))

ax = f.add_subplot(gs[len(y_vars),0])    
ax.ticklabel_format(style='sci',scilimits=(0,0), axis='x')

ax = f.add_subplot(gs[len(y_vars),5])
ax.ticklabel_format(style='sci',scilimits=(0,0), axis='x')

它让我得到了我想要的:

非常感谢。

编辑:最终代码片段和获得的情节。