【问题标题】:How to order boxplot categories in x axis如何在 x 轴上排序箱线图类别
【发布时间】:2021-07-23 01:11:57
【问题描述】:

我有一个包含两列 ACQUISITION_CHANNEL 和 HOURS_WORKED_CUMULATIVE 的 df,我使用下面的代码将其绘制为抖动的条形图。我想对 x 轴上的类别进行排序,以便它们首先按最高中位数排序。

ACQUISITION_CHANNEL HOURS_WORKED_CUMULATIVE
Referral 34
Job Platform 42
Referral 34
Offline 42
Referral 34
Digital 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') 

【问题讨论】:

  • 你有示例数据吗?
  • @TomMcLean 刚刚在中添加了一些示例数据

标签: python pandas matplotlib jupyter-notebook


【解决方案1】:

您可以在绘制数据之前按中位数对数据进行排序。 This question有个好答案

meds = df2.median()
meds.sort_values(ascending=False, inplace=True)
df2 = df2[meds.index]
df2.boxplot()

【讨论】:

    【解决方案2】:

    您可以通过结合 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)
    

    【讨论】:

    • 如果您的问题现在得到解答,您可以考虑将marking 视为已接受的答案之一。您也可以对有帮助的答案投票。
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2020-12-02
    • 2019-12-07
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多