Seaborn Plot 包括相同数据的不同分布
Seaborn Plot including different distributions of the same data
我希望创建一个 seaborn
pointplot
来显示列中的完整数据分布,以及最低 25% 的值分布和最高 25% 的值分布值,并且并排(在 x 轴上)。
到目前为止,我的尝试为我提供了这些值,但它们仅显示在 x 轴的同一部分,并没有在图表上从左到右展开,并且没有明显的方法来标记 x 刻度的点(我更喜欢,而不是通过图例)。
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')
您可以 .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)
我会考虑添加一个 "group" 然后绘制为单个 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='')
我希望创建一个 seaborn
pointplot
来显示列中的完整数据分布,以及最低 25% 的值分布和最高 25% 的值分布值,并且并排(在 x 轴上)。
到目前为止,我的尝试为我提供了这些值,但它们仅显示在 x 轴的同一部分,并没有在图表上从左到右展开,并且没有明显的方法来标记 x 刻度的点(我更喜欢,而不是通过图例)。
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')
您可以 .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)
我会考虑添加一个 "group" 然后绘制为单个 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='')