如何在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
相关产品推荐
相关产品推荐

