将变量名称放在Seaborn PairGrid的对角线上

时间:2018-01-08 07:18:20

标签: python matplotlib seaborn

如何将变量名称放在Seaborn PairGrid的对角线上,如PerformanceAnalytics R套件chart.Correlation function中那样?

enter image description here

我想这涉及到传递给map_diag的自定义函数,但不知道如何为它提取变量名。

例如,这显示整个数组:

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')

def diagfunc(x, **kws):
  ax = plt.gca()
  ax.annotate(x, xy=(.1, .9), xycoords=ax.transAxes)

sns.PairGrid(iris).map_diag(diagfunc)

chart attempt using map_diag

2 个答案:

答案 0 :(得分:2)

这里的原始解决方案不适用于seaborn> = 0.9的情况。这是由于#1464中所做的更改,因此从现在开始,数据将作为不包含name的numpy数组而不是pandas系列传递。

一种解决方法是,假设对网格中的轴顺序遵循数据框中列的顺序。然后使用该顺序可以遍历列名。

import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('iris')


it = iter(list(df.columns))

def diagfunc(*args, **kws):
    plt.gca().annotate(next(it), xy=(0, 1), xytext=(5,-5), ha="left", va="top", 
                       xycoords=plt.gca().transAxes, textcoords="offset points")

sns.PairGrid(df).map_diag(diagfunc)
plt.show()

resulting plot

答案 1 :(得分:0)

x.name函数中使用map_diag,该函数会传递每列的系列。

import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset('iris')

def diagfunc(x, **kws):
  ax = plt.gca()
  ax.annotate(x.name, xy=(0.05, 0.9), xycoords=ax.transAxes)

sns.PairGrid(iris).map_diag(diagfunc)

plot result

要同时删除普通轴标题,请按照Remove axis titles from Seaborn PairGrid添加:

for ax in g.axes.flatten():
  ax.set_ylabel('')
  ax.set_xlabel('')

plot without axis titles