10 蜂群图 swarmplot

这类图是什么

算法自动把邻近点错开,避免重叠。

看什么:样本不多时同时看清每个点与密度,比抖动更准确。

5 个案例

10-1 各馈线电流蜂群图:点自动错开不重叠

swarmplot 用算法把邻近点横向推开,样本不多时能同时看清"每个点在哪"和"哪里最密",比加随机抖动的条带图更准确——抖动会让本不重叠的点显得重叠。

各馈线电流蜂群图:点自动错开不重叠

10-2 四季负荷率蜂群图:密度分布自然呈现

四季负荷率蜂群图:密度分布自然呈现

10-3 两策略效率蜂群:不重叠地展示每个工况点

两策略效率蜂群:不重叠地展示每个工况点

10-4 分时段电压偏差蜂群图

分时段电压偏差蜂群图

10-5 各方案的线损率蜂群图:重叠程度即差异大小

各方案的线损率蜂群图:重叠程度即差异大小

代码

5 个函数取自 code/第三批_类别图261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。

# 摘自 code/第三批_类别图261107.py

def sw_01():
    """各馈线电流蜂群图:点自动错开不重叠。

    swarmplot 用算法把邻近点横向推开,样本不多时能同时看清"每个点在哪"和"哪里最密",
    比加随机抖动的条带图更准确——抖动会让本不重叠的点显得重叠。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(1001)
    rows = []
    for fd, mu in [("L1", 290), ("L2", 360), ("L3", 410)]:
        rows.append(pd.DataFrame({"电流": rng.gamma(9, mu / 9, 60), "馈线": fd}))
    df = pd.concat(rows, ignore_index=True)
    sns.swarmplot(data=df, x="馈线", y="电流", hue="馈线", palette=PALETTE3,
                  size=3.0, edgecolor="white", linewidth=0.3, legend=False, ax=ax)
    ax.set_xlabel("馈线")
    ax.set_ylabel("电流有效值 " + IT["I"] + " / A")
    ax.set_ylim(150, 580)
    save(fig, "10_蜂群图", "10_蜂群图_各馈线电流")

def sw_02():
    """四季负荷率蜂群图:密度分布自然呈现。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(1002)
    rows = []
    for s, mu in [("春季", 0.72), ("夏季", 0.83), ("秋季", 0.77)]:
        rows.append(pd.DataFrame({"负荷率": rng.normal(mu, 0.05, 55), "季节": s}))
    df = pd.concat(rows, ignore_index=True)
    sns.swarmplot(data=df, x="季节", y="负荷率", hue="季节", palette=PALETTE3,
                  size=3.0, edgecolor="white", linewidth=0.3, legend=False, ax=ax)
    ax.set_xlabel("季节")
    ax.set_ylabel("日负荷率")
    ax.set_ylim(0.55, 1.00)
    save(fig, "10_蜂群图", "10_蜂群图_四季负荷率")

def sw_03():
    """两策略效率蜂群:不重叠地展示每个工况点。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(1003)
    rows = []
    for p, mu, sd in [("策略 A", 0.842, 0.018), ("策略 B", 0.918, 0.012)]:
        rows.append(pd.DataFrame({"效率": rng.normal(mu, sd, 50), "策略": p}))
    df = pd.concat(rows, ignore_index=True)
    sns.swarmplot(data=df, x="策略", y="效率", hue="策略", palette=[C5, C1],
                  size=3.4, edgecolor="white", linewidth=0.3, legend=False, ax=ax)
    ax.set_xlabel("控制策略")
    ax.set_ylabel("系统综合效率 " + IT["eta"])
    ax.set_ylim(0.79, 0.96)
    save(fig, "10_蜂群图", "10_蜂群图_两策略效率")

def sw_04():
    """分时段电压偏差蜂群图。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(1004)
    rows = []
    for seg, mu, sd in [("0-4", 0.4, 1.4), ("8-12", 1.2, 2.0), ("16-20", 2.1, 2.6)]:
        rows.append(pd.DataFrame({"偏差": rng.normal(mu, sd, 50), "时段": seg}))
    df = pd.concat(rows, ignore_index=True)
    sns.swarmplot(data=df, x="时段", y="偏差", hue="时段", palette=PALETTE3,
                  size=3.0, edgecolor="white", linewidth=0.3, legend=False, ax=ax)
    ax.axhline(7, color=C2, lw=0.7, ls="--")
    ax.set_xlabel("时段 / h")
    ax.set_ylabel("电压偏差 / %")
    ax.set_ylim(-4, 10)
    save(fig, "10_蜂群图", "10_蜂群图_分时段电压偏差")

def sw_05():
    """各方案的线损率蜂群图:重叠程度即差异大小。"""
    fig, ax = new_fig(left=0.20)
    rng = np.random.default_rng(1005)
    rows = []
    for p, mu, sd in [("原状", 4.62, 0.22), ("方案一", 3.71, 0.20),
                      ("方案二", 3.24, 0.18)]:
        rows.append(pd.DataFrame({"线损率": rng.normal(mu, sd, 45), "方案": p}))
    df = pd.concat(rows, ignore_index=True)
    sns.swarmplot(data=df, x="方案", y="线损率", hue="方案", palette=PALETTE3,
                  size=3.0, edgecolor="white", linewidth=0.3, legend=False, ax=ax)
    ax.set_xlabel("降损方案")
    ax.set_ylabel("年线损率 / %")
    ax.set_ylim(2.6, 5.4)
    save(fig, "10_蜂群图", "10_蜂群图_各方案线损率")

说明

  • axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
  • 图内不放标题,图题由本文件的标题承担。
  • 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。
posted on 2026-11-08 00:13  小青蛙电气  阅读(2)  评论(0)    收藏  举报