【问题标题】:Proper diagonal Y axes for seaborn PairPlotseaborn PairPlot 的正确对角 Y 轴
【发布时间】:2020-12-17 17:16:08
【问题描述】:

我正在尝试使用 seaborn pairplot 进行一些可视化,我需要有适当的对角 Y 轴(可见!)根本没有标准化(只是计数)或密度标准化(bin 值的总和 = 1) . 有什么更好的方法?

我就是这样做的:

import numpy as np
import seaborn as sns
import pandas as pd

data = np.random.normal(0,2,[1000,3])

sss = sns.pairplot(pd.DataFrame(data),corner=True)
sss.axes[0][0].yaxis.tick_right()
sss.axes[0][0].get_yaxis().set_visible(True)
sss.axes[0][0].axis('on')
sss.axes[0][0].yaxis.set_label_position("right")
sss.axes[0][0].set_ylabel('Counts')

它给了我下图:

显然,我这里有错误的归一化(可能是在最大值上归一化)并且 y 轴线本身丢失了。

【问题讨论】:

  • 我相信归一化是因为直方图的总面积是1
  • @QuangHoang 可能你是对的,但正如我所说,我正在寻找另一种规范化

标签: python matplotlib seaborn


【解决方案1】:

默认情况下,每一行的y轴是共享的,对角线图的y轴本质上是没有意义的。

如果你想在那里绘制一些东西并保留你试图绘制的数据的比例,那么你应该以某种方式“打破”共享轴。我能想到的最简单的方法是使用twinx() 在同一位置创建一个新轴。

当然,为此您需要使用PairGrid() 而不是pairplot()

import numpy as np
import seaborn as sns
import pandas as pd

def my_hist(x, label, color):
    ax0 = plt.gca()
    ax = ax0.twinx()
    
    sns.despine(ax=ax, left=True, top=True, right=False)
    ax.yaxis.tick_right()
    ax.set_ylabel('Counts')
    
    ax.hist(x, label=label, color=color)

data = np.random.normal(0,2,[1000,3])
df = pd.DataFrame(data)

g = sns.PairGrid(df,corner=True)
g.map_diag(my_hist)
g.map_lower(sns.scatterplot)

【讨论】:

  • 您可以在pairplotgrid_kws=dict(diag_sharey=False) 中关闭对角y 轴共享。 (我也认为这与归一化问题无关?)答案的其余部分非常适合展示如何在右侧为边缘图放置 y 轴,但您也可以通过访问 @987654329 事后进行@属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2017-06-21
  • 2019-08-02
  • 1970-01-01
  • 2017-05-11
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多