You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib中按中位数从高到低排序箱线图X轴类别

按中位数自定义排序绘制带抖动散点的Matplotlib箱线图

要实现x轴类别按对应累计工时的中位数从高到低排列,核心是在准备绘图数据阶段固定类别排序,无需改动原有带抖动散点的绘图逻辑,具体实现如下:

关键调整逻辑

  • 先通过分组计算每个获客渠道对应的累计工时中位数,生成按中位数降序排列的渠道名称列表,作为x轴类别的最终显示顺序
  • 替换原有直接遍历groupby默认输出顺序的逻辑,按照排好的渠道顺序依次提取对应工时数据、生成与箱线图位置匹配的抖动散点坐标,避免类别错位

完整修改后的可运行代码

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

group = 'ACQUISITION_CHANNEL'
column = 'HOURS_WORKED_CUMULATIVE'

# 计算排序依据:按渠道工时中位数降序生成固定的类别顺序
channel_order = (
    df.groupby(group)[column]
    .median()
    .sort_values(ascending=False)
    .index
    .tolist()
)

names, vals, xs = [], [] ,[]

# 按排好的渠道顺序组织绘图数据
for i, ch in enumerate(channel_order):
    names.append(ch)
    sub_values = df.loc[df[group] == ch, column].tolist()
    vals.append(sub_values)
    # 生成对应x轴位置的抖动散点坐标
    xs.append(np.random.normal(i + 1, 0.1, len(sub_values)))

plt.boxplot(vals, labels=names, showfliers=False)
ngroup = len(vals)
clevels = np.linspace(0., 1., ngroup)

for x, val in zip(xs, vals):
    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')
plt.show()

效果说明:最终生成的图表会严格按照“累计工时中位数最高的渠道在x轴最左侧,中位数最低的渠道在x轴最右侧”的规则排列,抖动散点和对应箱线图位置完全对齐,不会出现顺序混乱的问题。

内容的提问来源于stack exchange,提问作者Barney Cooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 08:54:02