【问题标题】:Custom binning in seaborn pairplotseaborn pairplot 中的自定义分箱
【发布时间】:2019-05-30 18:58:45
【问题描述】:

我是 seaborn 的新手,我目前正在使用 pairplot 的功能......使用以下功能

seaborn.pairplot(data,
                 hue="Class",
                 diag_king="hist",
                 diag_kws={'alpha'=0.5}
                 )

我能够实现我想要的大部分内容:来自我的pandas 数据框data 的散点图网格,根据Class 列的不同分布,以及沿对角线的半透明直方图。

我发现通过将 bin=[...] 传递给 diag_kws 我可以让所有对角线图采用该分箱,但我希望我的数据框的每一列都从一个专用的字典(键是列名)。

是否可以使用diag_kws 实现这一目标?或者我是否需要在调用pairplot 后单独访问每个对角线图并手动重新绑定它们?最有效的方法是什么?

【问题讨论】:

  • PairGrid 提供 map_diag 可以用来映射自定义函数,该函数会更改每次调用中的参数。
  • @ImportanceOfBeingErnest 感谢您的建议!我知道如何将pyplot 方法与map_diag 一起使用,但是如何构建一个自定义函数来访问正在绘制的变量的名称?
  • 我猜FacetGridmap_dataframe 不等于PairGrid,对吧?在这种情况下,需要有创造力。例如。函数被调用的次数表示它当前在哪个轴上工作,或者当前轴在网格中的位置......不过我还没有尝试过。
  • 好的,在调用g = seaborn.pairplot(...) 之后,我可以遍历g.axes 的对角线元素并尝试在那里设置垃圾箱......这似乎过于hacky,但我想它必须做... :)
  • 嗯,我不是这个意思,但当然也有可能。我在下面提供了我的建议作为答案。

标签: python matplotlib seaborn


【解决方案1】:

PairGrid 提供map_diag 可以用来映射自定义函数,该函数会更改每次调用中的参数。这可能看起来像这样。请注意,需要注意顺序(通过vars 参数)以确保应用正确的参数。

import matplotlib.pyplot as plt
import seaborn as sns


iris = sns.load_dataset("iris", cache=True)
col_list = ['petal_length', 'petal_width', 'sepal_length', 'sepal_width'] 
cols = iter(col_list)

bins = {'sepal_length' : 10, 'sepal_width' : 5, 
        'petal_length' : 35, 'petal_width' : 12}


def myhist(x, **kwargs):
    b = bins[next(cols)]
    plt.text(0.5,0.9, f"bins = {b}", ha="center", 
             transform=plt.gca().transAxes)
    plt.hist(x, bins=b, **kwargs)


g = sns.PairGrid(iris, vars=col_list)
g = g.map_diag(myhist)
g = g.map_offdiag(plt.scatter)

plt.show()

【讨论】:

  • 我正在使用pairplot,如何为每个绘图设置轴?我有一个 4 x 4 的图,具有不同的测距值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2021-02-04
  • 2020-08-08
  • 2016-09-09
  • 2016-03-19
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多