我使用下面的代码将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']
答案 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()