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 量级的仿真算例,随机种子固定。
浙公网安备 33010602011771号