seaborn PairGrid中的分类顺序

时间:2017-09-28 09:14:44

标签: python seaborn categorical-data

我使用下面的代码将seaborn stripplot映射到seaborn PairGrid:

import pandas as pd
import seaborn as sns

df = (pd.read_csv(filepath_or_buffer='http://vincentarelbundock.github.io/' +
              'Rdatasets/csv/ggplot2/diamonds.csv')
    .drop(labels='Unnamed: 0', axis=1)
    .astype(dtype={'cut': 'category', 'color': 'category',
                   'clarity': 'category'}))
agged = df.groupby(by=['cut', 'color']).mean().sort_index().reset_index()
g = sns.PairGrid(data=agged, x_vars=agged.columns[2:], y_vars=['cut', 'color'],
             size=5, aspect=.65)
g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d')

默认情况下,' cut'中的类别facet按字母顺序显示。但是,我想指定顺序:

['Fair', 'Good', 'Very Good', 'Premium', 'Ideal']

我已尝试通过“订单”#39; stripplot的参数如下:

g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d',
  order=['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'])

虽然这可以正确地对“剪切”中的类别进行排序,但它不会在“颜色”中绘制任何内容。小平面。我也试过指定颜色' facet排序参数如下:

g.map(func=sns.stripplot, orient='h', size=10, palette='Blues_d',
  order=['Fair', 'Good', 'Very Good', 'Premium', 'Ideal', 'D', 'E', 'F',
         'G', 'H', I'])

但是,这里的问题是order参数中的所有值都出现在'颜色'并且' cut'刻面。

是否可以在映射函数中指定一个排序,导致两个方面的排序正确,没有重复?

['Fair', 'Good', 'Very Good', 'Premium', 'Ideal']
['D', 'E', 'F', 'G', 'H', I']

1 个答案:

答案 0 :(得分:0)

问题是网格中的每一行都有不同的类别。因此,对于每行的子图,您需要不同的order

我不认为有自动方式提供不同的订单,但您可以根据行变量定义自己的订单字典

order = {'cut'  :['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'],
         'color':['D', 'E', 'F', 'G', 'H', 'I']}

然后您可以将自定义函数映射到网格,根据行变量选择正确的顺序。

def ordered_stripplot(*args, **kwargs):
    order = kwargs.pop("order")
    sns.stripplot(args[0],args[1], order=order[args[1].name], **kwargs)

g.map(ordered_stripplot, order=order, orient='h', size=10, palette='Blues_d')

而不是直接映射到sns.stripplot,而是映射到自定义函数,该函数将订单字典作为输入,并根据参数选择正确的顺序。这是提供给sns.stripplot的,在此函数中被调用。

完整代码:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = (pd.read_csv(filepath_or_buffer='http://vincentarelbundock.github.io/' +
              'Rdatasets/csv/ggplot2/diamonds.csv')
    .drop(labels='Unnamed: 0', axis=1)
    .astype(dtype={'cut': 'category', 'color': 'category',
                   'clarity': 'category'}))
agged = df.groupby(by=['cut', 'color']).mean().sort_index().reset_index()

order = {'cut'  :['Fair', 'Good', 'Very Good', 'Premium', 'Ideal'],
         'color':['D', 'E', 'F', 'G', 'H', 'I']}

g = sns.PairGrid(data=agged, x_vars=agged.columns[2:], y_vars=['cut', 'color'],
             size=3, aspect=.65)

def ordered_stripplot(*args, **kwargs):
    order = kwargs.pop("order")
    sns.stripplot(args[0],args[1], order=order[args[1].name], **kwargs)

g.map(ordered_stripplot, order=order, orient='h', size=10, palette='Blues_d')

plt.tight_layout()
plt.show()

enter image description here