使用Seaborn绘制同一数据的不同分布

我想创建一个seabornpointplot,以显示一个列中的完整数据分布,以及最低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')

enter image description here


回答:

您可以将新的分布.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')]])

得到的结果是:

enter image description here

如果您想添加组别,您可以简单地使用.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)

enter image description here

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注