我想创建一个seaborn
的pointplot
,以显示一个列中的完整数据分布,以及最低25%的值的分布和最高25%的值的分布,并将它们并排显示(在x轴上)。到目前为止,我的尝试已经提供了这些值,但它们只显示在x轴的同一部分,而不是从左到右在图表上展开,并且没有明显的方式通过x刻度标记这些点(我更喜欢这样,而不是通过图例)。
import seaborn as snsimport pandas as pdimport matplotlib.pyplot as plt%matplotlib notebookdf = sns.load_dataset('tips')df1 = df[(df.total_bill < df.total_bill.quantile(.25))]df2 = df[(df.total_bill > df.total_bill.quantile(.75))]sns.pointplot(y=df['total_bill'], data=df, color='red')sns.pointplot(y=df1['total_bill'], data=df1, color='green')sns.pointplot(y=df2['total_bill'], data=df2, color='blue')
回答:
您可以将新的分布.join()
到现有的df
中,然后使用宽格式.plot()
:
lower, upper = df.total_bill.quantile([.25, .75]).values.tolist()df = df.join(df.loc[df.total_bill < lower, 'total_bill'], rsuffix='_lower')df = df.join(df.loc[df.total_bill > upper, 'total_bill'], rsuffix='_upper')sns.pointplot(data=df.loc[:, [c for c in df.columns if c.startswith('total')]])
得到的结果是:
如果您想添加组别,您可以简单地使用.unstack()
转换为long
格式:
df = df.loc[:, ['total_bill', 'total_bill_upper', 'total_bill_lower']].unstack().reset_index().drop('level_1', axis=1).dropna()df.columns = ['grp', 'val']
得到的结果是:
sns.pointplot(x='grp', y='val', hue='grp', data=df)