[英]How to order boxplot categories in x axis
我有一个包含两列 ACQUISITION_CHANNEL 和 HOURS_WORKED_CUMULATIVE 的 df,我使用下面的代码将其绘制为抖动条 plot。 我想对 x 轴上的类别进行排序,以便它们首先按最高中位数排序。
ACQUISITION_CHANNEL | HOURS_WORKED_CUMULATIVE |
---|---|
推荐 | 34 |
工作平台 | 42 |
推荐 | 34 |
离线 | 42 |
推荐 | 34 |
数字的 | 42 |
...
group = 'ACQUISITION_CHANNEL'
column = 'HOURS_WORKED_CUMULATIVE'
grouped = df.groupby(group)
names, vals, xs = [], [] ,[]
for i, (name, subdf) in enumerate(grouped):
names.append(name)
vals.append(subdf[column].tolist())
xs.append(np.random.normal(i+1, 0.1, subdf.shape[0]))
plt.boxplot(vals, labels=names, showfliers=False )
ngroup = len(vals)
clevels = np.linspace(0., 1., ngroup)
for x, val, clevel in zip(xs, vals, clevels):
plt.scatter(x, val, alpha=0.4, c='#1f77b4')
plt.title('Hours Worked by Acquisition Channel')
plt.xlabel('Acquisition Channel')
plt.ylabel('Total Hours Worked')
您可以在绘制数据之前按中位数对数据进行排序。 这个问题有很好的答案
meds = df2.median()
meds.sort_values(ascending=False, inplace=True)
df2 = df2[meds.index]
df2.boxplot()
您可以通过结合 seaborn 的boxplot
和stripplot
来简化构造:
import seaborn as sns
import pandas as pd
import numpy as np
group = 'ACQUISITION_CHANNEL'
column = 'HOURS_WORKED_CUMULATIVE'
df = pd.DataFrame({group: np.random.choice(['Referral', 'Job Platform', 'Offline', 'Digital'], 1000),
column: np.random.randint(10, 300, 1000) + np.random.randint(1, 30, 1000) ** 2})
x_order = df.groupby(group)[column].agg('median').sort_values(ascending=False).index
ax = sns.boxplot(data=df, x=group, order=x_order, y=column,
palette=['skyblue'], medianprops={'color':'orange'})
sns.stripplot(data=df, x=group, order=x_order, y=column, jitter=0.4, alpha=0.6, ax=ax)
stripplot 也可以替换为swarmplot
:
sns.swarmplot(data=df, x=group, order=x_order, y=column, size=3, alpha=0.6, ax=ax)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.