01 箱线图 boxplot:10 个案例说明它能展示什么

这类图能直观展示什么

箱线图用一个矩形加两条须概括一整组数据的分布:箱体上下沿是 25% 与 75% 分位(四分位距 IQR),箱内横线是中位数,须延伸到 1.5 倍 IQR 以内的最远点,超出的点单独画成离群点。

它能直观展示四件事:① 多组之间的水平高低(箱体位置);② 各组内部的离散程度(箱体高度);③ 数据是否偏斜(中位线在箱内的位置、两条须的长短);④ 哪些样本是异常值(须外的散点)。它不展示分布的具体形状——要看形状请用小提琴图。

  • 箱体 = 25%~75% 分位,红线 = 中位数,须 = 1.5 倍 IQR 内最远点,须外散点 = 离群值。

10 个案例

01-1 四季日负荷率:组间高低差异一眼可见

箱体位置依次抬高,直接给出"哪一季负荷率高"的结论;夏季箱体最窄,说明该季负荷率集中在高位、日内波动小;冬季上下须明显更长,说明日内负荷起伏最大。三件事(高低、稳定性、波动范围)在一张图里同时读出。

四季日负荷率:组间高低差异一眼可见

01-2 三台主变负载率:离散程度可直接比较

箱体高度即四分位距,是"稳定性"的量化指标——箱体越矮说明负载率越稳定。T2 箱体最矮且中位数适中,是运行最平稳的一台;T3 箱体高且有向上离群点,说明存在短时重载。

三台主变负载率:离散程度可直接比较

01-3 母线电压采样:离群点自动标出

箱体之外的单独散点就是统计意义上的离群值,不必事先设阈值。这里 6 个离群点全部落在下限附近,指向同一类问题(低压侧投切或大负荷启动),比看原始时序曲线更快定位异常时刻。

母线电压采样:离群点自动标出

01-4 谐波电流分布:偏态方向由中位线与须长暴露

中位线明显偏向箱体下沿、且上须远长于下须,是右偏分布的特征——多数时段电流不高,少数时段被大负荷拉出长尾。7 次谐波近似对称,两相对照即可判断该不该用平均值代表整体。

谐波电流分布:偏态方向由中位线与须长暴露

01-5 光伏出力:P25~P75 即可靠的出力区间

箱体上下沿正好是 25% 与 75% 分位,可直接当作"八成时段落在区间内"的运行区间来用。设计储能容量时,用箱体范围而非最大最小值,能避免被极端晴天/阴天误导。

光伏出力:P25~P75 即可靠的出力区间

01-6 变压器温升:超限工况被须端与阈值线直接夹出

把限值线画在同一坐标系里,箱体与限值的相对位置就回答了"是否超标、超标多少"。1.2 倍负载率时箱体上沿已越过限值,且上部须远超,说明该工况不宜长期运行。

变压器温升:超限工况被须端与阈值线直接夹出

01-7 两种控制策略:箱体不重叠,差异显著

判断两组是否有实质差别,看箱体重叠程度比看均值更可靠。这里两箱完全分离,说明策略 B 的效果提升已超出随机波动范围,不需要再跑显著性检验就能下"有效"的结论。

两种控制策略:箱体不重叠,差异显著

01-8 六个月线损率:时间漂移由中位数走向呈现

把多个月份并列,中位线的整体走势就是趋势,箱体高度变化就是波动性变化。3 月后中位数持续下移、箱体同步变矮,说明降损措施从 3 月起既降了均值也压住了波动。

六个月线损率:时间漂移由中位数走向呈现

01-9 故障修复时长:长尾由长须与密集离群点暴露

箱体很矮但上须很长,说明多数故障修得快、少数修得极慢——这是典型的长尾分布。这类数据不能只看平均修复时长,因为少数几次超长故障会把平均值整体抬高。

故障修复时长:长尾由长须与密集离群点暴露

01-10 五项指标同图:量纲归一后横向比较

把不同量纲的指标归一化后并排,能一眼看出"哪项分散、哪项集中"。这里负载率的箱体最长(四分位距约 0.12),说明它是当前波动最大的指标,应优先治理。

五项指标同图:量纲归一后横向比较

代码

以下 10 个函数取自 code/箱线图案例261107.py。版式(宋体 + Times、10 磅、刻度朝内四边、图内无标题、留白自检)由 code/公共配置261107.py 的 setup_cn_style() 与 save() 统一提供,箱线与小提琴的样式另由其中的 box()、violin() 封装。

# 摘自 code/箱线图案例261107.py

def bx_01():
    """四季日负荷率:组间高低差异一眼可见。

    箱体位置依次抬高,直接给出"哪一季负荷率高"的结论;夏季箱体最窄,说明该季负荷率集中在高位、日内波动小;
    冬季上下须明显更长,说明日内负荷起伏最大。三件事(高低、稳定性、波动范围)在一张图里同时读出。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(101)
    data = [rng.normal(0.72, 0.055, 90), rng.normal(0.83, 0.042, 90),
            rng.normal(0.78, 0.048, 90), rng.normal(0.75, 0.075, 90)]
    box(ax, data, ["春季", "夏季", "秋季", "冬季"], colors=[C5, C1, C5, C5])
    ax.set_xlabel("季节")
    ax.set_ylabel("日负荷率")
    ax.set_ylim(0.52, 1.02)
    save(fig, "01_箱线图", "01_箱线图_四季日负荷率")

def bx_02():
    """三台主变负载率:离散程度可直接比较。

    箱体高度即四分位距,是"稳定性"的量化指标——箱体越矮说明负载率越稳定。
    T2 箱体最矮且中位数适中,是运行最平稳的一台;T3 箱体高且有向上离群点,说明存在短时重载。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(102)
    data = [rng.normal(0.72, 0.060, 120), rng.normal(0.66, 0.028, 120),
            rng.normal(0.81, 0.085, 120)]
    box(ax, data, ["T1", "T2", "T3"], colors=[C5, C1, C5])
    ax.axhline(0.80, color=C2, lw=0.8, ls="--", label="重载阈值 80%")
    ax.set_xlabel("主变压器")
    ax.set_ylabel("负载率 " + IT["beta"])
    ax.set_ylim(0.45, 1.12)
    legend(ax, "upper left", ncol=1)
    save(fig, "01_箱线图", "01_箱线图_主变负载率离散度")

def bx_03():
    """母线电压采样:离群点自动标出。

    箱体之外的单独散点就是统计意义上的离群值,不必事先设阈值。这里 6 个离群点全部落在下限附近,
    指向同一类问题(低压侧投切或大负荷启动),比看原始时序曲线更快定位异常时刻。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(103)
    base = rng.normal(10.08, 0.045, 200)
    out = np.array([9.86, 9.90, 9.88, 9.92, 9.85, 9.91])
    data = np.concatenate([base, out])
    box(ax, [data], ["10 kV Ⅰ 段母线"], colors=[C5])
    ax.axhline(9.93, color=C2, lw=0.8, ls="--", label="允许下限 -0.7%")
    ax.set_xlabel("监测对象")
    ax.set_ylabel("母线电压 " + IT["U"] + " / kV")
    ax.set_ylim(9.80, 10.24)
    legend(ax, "lower right", ncol=1)
    save(fig, "01_箱线图", "01_箱线图_母线电压离群点")

def bx_04():
    """谐波电流分布:偏态方向由中位线与须长暴露。

    中位线明显偏向箱体下沿、且上须远长于下须,是右偏分布的特征——多数时段电流不高,
    少数时段被大负荷拉出长尾。7 次谐波近似对称,两相对照即可判断该不该用平均值代表整体。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(104)
    d1 = rng.gamma(2.2, 9.0, 200)
    d2 = rng.normal(18, 5.2, 200)
    box(ax, [d1, d2], ["5 次谐波", "7 次谐波"], colors=[C3, C5])
    ax.set_xlabel("谐波次数")
    ax.set_ylabel("谐波电流 " + IT["I"] + SUB["h"] + " / A")
    ax.set_ylim(0, 62)
    save(fig, "01_箱线图", "01_箱线图_谐波电流偏态")

def bx_05():
    """光伏出力:P25~P75 即可靠的出力区间。

    箱体上下沿正好是 25% 与 75% 分位,可直接当作"八成时段落在区间内"的运行区间来用。
    设计储能容量时,用箱体范围而非最大最小值,能避免被极端晴天/阴天误导。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(105)
    data = [rng.normal(232, 62, 150), rng.normal(468, 96, 150),
            rng.normal(396, 118, 150)]
    box(ax, data, ["1 月", "7 月", "10 月"], colors=[C5, C1, C5])
    ax.set_xlabel("月份")
    ax.set_ylabel("日均出力 " + IT["P"] + " / kW")
    ax.set_ylim(-40, 700)
    save(fig, "01_箱线图", "01_箱线图_光伏出力分位区间")

def bx_06():
    """变压器温升:超限工况被须端与阈值线直接夹出。

    把限值线画在同一坐标系里,箱体与限值的相对位置就回答了"是否超标、超标多少"。
    1.2 倍负载率时箱体上沿已越过限值,且上部须远超,说明该工况不宜长期运行。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(106)
    load = [0.4, 0.6, 0.8, 1.0, 1.2]
    data = [rng.normal(28 + 26 * L ** 2, 2.4 + 1.2 * L, 80) for L in load]
    box(ax, data, [f"{L:.1f}" for L in load], colors=[C5, C5, C1, C3, C2])
    ax.axhline(65, color=C2, lw=0.9, ls="--", label="限值 65 K")
    ax.set_xlabel("负载率 " + IT["beta"])
    ax.set_ylabel("顶层油温升 " + IT["theta"] + " / K")
    ax.set_ylim(20, 92)
    legend(ax, "upper left", ncol=1)
    save(fig, "01_箱线图", "01_箱线图_变压器温升超限")

def bx_07():
    """两种控制策略:箱体不重叠,差异显著。

    判断两组是否有实质差别,看箱体重叠程度比看均值更可靠。这里两箱完全分离,
    说明策略 B 的效果提升已超出随机波动范围,不需要再跑显著性检验就能下"有效"的结论。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(107)
    a = rng.normal(0.842, 0.018, 100)
    b = rng.normal(0.918, 0.012, 100)
    box(ax, [a, b], ["策略 A", "策略 B"], colors=[C5, C1])
    ax.set_xlabel("控制策略")
    ax.set_ylabel("系统综合效率 " + IT["eta"])
    ax.set_ylim(0.79, 0.96)
    save(fig, "01_箱线图", "01_箱线图_两策略效果差异")

def bx_08():
    """六个月线损率:时间漂移由中位数走向呈现。

    把多个月份并列,中位线的整体走势就是趋势,箱体高度变化就是波动性变化。
    3 月后中位数持续下移、箱体同步变矮,说明降损措施从 3 月起既降了均值也压住了波动。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(108)
    means = [4.92, 4.86, 4.41, 3.98, 3.80, 3.62]
    sds = [0.34, 0.32, 0.26, 0.22, 0.19, 0.17]
    data = [rng.normal(m, s, 80) for m, s in zip(means, sds)]
    box(ax, data, ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月"],
        colors=[C5, C5, C1, C5, C5, C5])
    ax.set_xlabel("月份")
    ax.set_ylabel("月线损率 / %")
    ax.set_ylim(3.0, 5.9)
    save(fig, "01_箱线图", "01_箱线图_线损率逐月漂移")

def bx_09():
    """故障修复时长:长尾由长须与密集离群点暴露。

    箱体很矮但上须很长,说明多数故障修得快、少数修得极慢——这是典型的长尾分布。
    这类数据不能只看平均修复时长,因为少数几次超长故障会把平均值整体抬高。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(109)
    fast = rng.gamma(3.0, 0.9, 180)
    slow = rng.uniform(8, 28, 22)
    data = np.concatenate([fast, slow])
    box(ax, [data], ["全部故障"], colors=[C3])
    ax.set_xlabel("统计口径")
    ax.set_ylabel("修复时长 " + IT["t"] + " / h")
    ax.set_ylim(0, 32)
    save(fig, "01_箱线图", "01_箱线图_修复时长长尾")

def bx_10():
    """五项指标同图:量纲归一后横向比较。

    把不同量纲的指标归一化后并排,能一眼看出"哪项分散、哪项集中"。
    这里负载率的箱体最长(四分位距约 0.12),说明它是当前波动最大的指标,应优先治理。
    """
    fig, ax = new_fig(left=0.21)
    rng = np.random.default_rng(110)
    data = [rng.normal(0.82, 0.052, 100), rng.normal(0.75, 0.088, 100),
            rng.normal(0.91, 0.036, 100), rng.normal(0.68, 0.062, 100),
            rng.normal(0.86, 0.044, 100)]
    names = ["线损率", "负载率", "电压合格率", "功率因数", "可靠性"]
    box(ax, data, names, colors=[C5] * 5)
    ax.set_xlabel("指标")
    ax.set_ylabel("归一化指标值")
    ax.set_ylim(0.44, 1.06)
    save(fig, "01_箱线图", "01_箱线图_五指标归一对比")
posted on 2026-11-08 00:12  小青蛙电气  阅读(2)  评论(0)    收藏  举报