Seaborn绘图包含相同数据的不同分布

4
我希望创建一个seaborn pointplot用于显示一个列中的完整数据分布,同时还能显示最低25%值的分布和最高25%值的分布,三者并排显示在同一张图中(x轴上)。 到目前为止,我尝试了使用该方法,它提供了相应的值,但这些值只显示在x轴的同一部分,并没有在图形上从左到右展开,也没有明显的方式来标记x刻度上的点(我更喜欢使用x-ticks而不是传统的图例)。
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook

df = 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

2个回答

3
您可以使用.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)

enter image description here


2
我会考虑添加“组”,然后将其绘制为单个DataFrame。
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook

df = sns.load_dataset('tips')
df = df.append(df)

df.loc[(df.total_bill < df.total_bill.quantile(.25)),'group'] = 'L'
df.loc[(df.total_bill > df.total_bill.quantile(.75)),'group'] = 'H'
df = df.reset_index(drop=True)
df.loc[len(df)/2:,'group'] = 'all'

sns.pointplot(data = df,
              y='total_bill',
              x='group',
              hue='group',
              linestyles='')

figure output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接