繁体   English   中英

如何在 x 轴上排序箱线图类别

[英]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 的boxplotstripplot来简化构造:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM