04 直方图 histplot
这类图是什么
直方图,可叠加 KDE、按组分层/堆叠/并排。
看什么:看单一变量的频次分布,multiple 参数决定多组之间的叠加方式。
5 个案例
04-1 日负荷分布:直方图叠加核密度曲线
histplot 的 kde=True 会在直方图上叠加平滑密度线,柱高看频次、曲线看形状,双峰结构比纯直方图更容易判断。

04-2 三类负荷的分布对比:分层叠加
multiple="layer" 让三组半透明叠加,重叠处颜色加深,能看出哪一段是三组共同的高频区。

04-3 电压偏差分布:堆叠显示合格与超标部分

04-4 分时段负荷分布:并排柱避免遮挡

04-5 变压器温升分布:按负载率分箱着色
用 hue 加上 bin 统计,能看出一部分高负载样本已经越过限值线,直方图把"越限多少"量化成柱子高度,而不是只说一句超标。

代码
5 个函数取自 code/第二批_分布图261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。
# 摘自 code/第二批_分布图261107.py
def hs_01():
"""日负荷分布:直方图叠加核密度曲线。
histplot 的 kde=True 会在直方图上叠加平滑密度线,柱高看频次、曲线看形状,
双峰结构比纯直方图更容易判断。
"""
fig, ax = new_fig(left=0.19, bottom=0.21)
rng = np.random.default_rng(401)
d = np.concatenate([rng.normal(430, 55, 700), rng.normal(660, 60, 560)])
sns.histplot(x=d, bins=32, kde=True, color=C5, edgecolor="0.35",
linewidth=0.4, ax=ax, line_kws={"color": C1, "lw": 1.0})
ax.set_xlabel("有功负荷 " + IT["P"] + " / kW")
ax.set_ylabel("频次")
ax.set_xlim(240, 870)
save(fig, "04_直方图", "04_直方图_日负荷分布")
def hs_02():
"""三类负荷的分布对比:分层叠加。
multiple="layer" 让三组半透明叠加,重叠处颜色加深,能看出哪一段是三组共同的高频区。
"""
fig, ax = new_fig(left=0.19, bottom=0.21)
rng = np.random.default_rng(402)
rows = []
for kind, mu, sd in [("工业", 620, 90), ("商业", 480, 70), ("居民", 360, 55)]:
rows.append(pd.DataFrame({"负荷": rng.normal(mu, sd, 600), "类型": kind}))
df = pd.concat(rows, ignore_index=True)
sns.histplot(data=df, x="负荷", hue="类型", bins=28, multiple="layer",
palette=PALETTE3, alpha=0.55, edgecolor="0.4", linewidth=0.3,
ax=ax)
ax.set_xlabel("有功负荷 " + IT["P"] + " / kW")
ax.set_ylabel("频次")
ax.set_xlim(180, 920)
legend_in(ax, "upper right")
save(fig, "04_直方图", "04_直方图_三类负荷对比")
def hs_03():
"""电压偏差分布:堆叠显示合格与超标部分。"""
fig, ax = new_fig(left=0.19, bottom=0.21)
rng = np.random.default_rng(403)
d = rng.normal(0.8, 2.6, 1600)
df = pd.DataFrame({"偏差": d})
df["判定"] = np.where(np.abs(df["偏差"]) > 7, "超标", "合格")
sns.histplot(data=df, x="偏差", hue="判定", bins=34, multiple="stack",
palette=[C5, C3], edgecolor="0.4", linewidth=0.3, ax=ax)
ax.axvline(7, color=C2, lw=0.8, ls="--")
ax.axvline(-7, color=C2, lw=0.8, ls=":")
ax.set_xlabel("电压偏差 / %")
ax.set_ylabel("频次")
ax.set_xlim(-11, 12)
legend_in(ax, "upper left")
save(fig, "04_直方图", "04_直方图_电压偏差合格判定")
def hs_04():
"""分时段负荷分布:并排柱避免遮挡。"""
fig, ax = new_fig(left=0.19, bottom=0.23)
rng = np.random.default_rng(404)
rows = []
for seg, mu in [("峰段", 680), ("平段", 520), ("谷段", 360)]:
rows.append(pd.DataFrame({"负荷": rng.normal(mu, 60, 500), "时段": seg}))
df = pd.concat(rows, ignore_index=True)
sns.histplot(data=df, x="负荷", hue="时段", bins=24, multiple="dodge",
palette=PALETTE3, edgecolor="0.4", linewidth=0.3, ax=ax)
ax.set_xlabel("有功负荷 " + IT["P"] + " / kW")
ax.set_ylabel("频次")
ax.set_xlim(180, 880)
legend_in(ax, "upper right")
save(fig, "04_直方图", "04_直方图_分时段负荷")
def hs_05():
"""变压器温升分布:按负载率分箱着色。
用 hue 加上 bin 统计,能看出一部分高负载样本已经越过限值线,
直方图把"越限多少"量化成柱子高度,而不是只说一句超标。
"""
fig, ax = new_fig(left=0.19, bottom=0.21)
rng = np.random.default_rng(405)
dT = rng.normal(48, 11, 900)
df = pd.DataFrame({"温升": dT})
df["状态"] = np.where(df["温升"] > 65, "超限", "正常")
sns.histplot(data=df, x="温升", hue="状态", bins=30, multiple="stack",
palette=[C5, C2], edgecolor="0.4", linewidth=0.3, ax=ax)
ax.axvline(65, color=C2, lw=0.9, ls="--")
ax.set_xlabel("顶层油温升 " + IT["T"] + " / K")
ax.set_ylabel("频次")
ax.set_xlim(10, 90)
legend_in(ax, "upper right")
save(fig, "04_直方图", "04_直方图_变压器温升超限")
说明
- axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。
浙公网安备 33010602011771号