21 热图 heatmap
21 热图 heatmap
这类图是什么
矩阵热图,可标注数值、掩掉上三角、自定义色条。
看什么:看二维表格的整体模式,标注后兼作查表用。
5 个案例
21-1 电气量相关系数矩阵:只用上三角并标注数值

21-2 月—时负荷矩阵:不标数值,靠色阶看整体节律

21-3 各节点各时段电压偏差:热点色块定位

21-4 谐波次数与节点的耦合矩阵:标数值便于查表

21-5 方案评估矩阵:多指标归一后比较优劣

代码
5 个函数取自 code/第四批_回归与矩阵261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。
# 摘自 code/第四批_回归与矩阵261107.py
def hm_01():
"""电气量相关系数矩阵:只用上三角并标注数值。"""
fig, ax = new_fig(left=0.26, bottom=0.28, right=0.88)
rng = np.random.default_rng(2101)
names = ["负荷", "电压", "电流", "功率因数", "温度", "谐波"]
A = rng.normal(0, 1, (6, 400))
A[1] = -0.78 * A[0] + 0.4 * rng.normal(0, 1, 400)
A[2] = 0.92 * A[0] + 0.2 * rng.normal(0, 1, 400)
A[3] = 0.52 * A[0] + 0.5 * rng.normal(0, 1, 400)
A[4] = 0.70 * A[0] + 0.5 * rng.normal(0, 1, 400)
A[5] = 0.48 * A[0] + 0.6 * rng.normal(0, 1, 400)
Cm = np.corrcoef(A)
mask = np.triu(np.ones_like(Cm, dtype=bool), k=1)
sns.heatmap(Cm, mask=mask, annot=True, fmt=".2f", cmap=DIV, vmin=-1, vmax=1,
square=True, linewidths=0.4, linecolor="white",
annot_kws={"size": FS - 3}, cbar_kws={"label": "相关系数", "shrink": 0.82},
xticklabels=names, yticklabels=names, ax=ax)
ax.tick_params(direction="in", length=2.5, width=0.5)
save(fig, "21_热图", "21_热图_相关系数矩阵")
def hm_02():
"""月—时负荷矩阵:不标数值,靠色阶看整体节律。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.88)
rng = np.random.default_rng(2102)
M = np.zeros((12, 24))
for m in range(12):
s = 1 + 0.22 * np.cos((m - 6.5) / 12 * 2 * np.pi + np.pi)
for h in range(24):
M[m, h] = s * (430 + 180 * np.exp(-((h - 10) / 3.4) ** 2)
+ 210 * np.exp(-((h - 17) / 3.0) ** 2)) + rng.normal(0, 12)
sns.heatmap(M, cmap=SEQ, linewidths=0.2, linecolor="white",
cbar_kws={"label": "负荷 P / kW", "shrink": 0.85},
xticklabels=4, yticklabels=2, ax=ax)
ax.tick_params(direction="in", length=2.5, width=0.5)
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("月份")
save(fig, "21_热图", "21_热图_月时负荷矩阵")
def hm_03():
"""各节点各时段电压偏差:热点色块定位。"""
fig, ax = new_fig(left=0.19, bottom=0.21, right=0.88)
rng = np.random.default_rng(2103)
M = np.zeros((10, 24))
for i in range(10):
for h in range(24):
M[i, h] = 1.4 - 0.55 * i + rng.normal(0, 0.4) \
- 1.2 * (i / 10) * np.exp(-((h - 19) / 3.5) ** 2) * 3.2
sns.heatmap(M, cmap=SEQ, linewidths=0.2, linecolor="white",
cbar_kws={"label": "电压偏差 / %", "shrink": 0.85},
xticklabels=4, ax=ax)
ax.tick_params(direction="in", length=2.5, width=0.5)
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("节点编号")
save(fig, "21_热图", "21_热图_节点时段电压热点")
def hm_04():
"""谐波次数与节点的耦合矩阵:标数值便于查表。"""
fig, ax = new_fig(left=0.20, bottom=0.22, right=0.88)
rng = np.random.default_rng(2104)
orders = [3, 5, 7, 9, 11, 13]
M = np.zeros((6, 6))
for j, h in enumerate(orders):
M[:, j] = 30 / h ** 0.9 * (1 + 0.5 * rng.random(6))
sns.heatmap(M, annot=True, fmt=".1f", cmap=SEQ, linewidths=0.4,
linecolor="white", annot_kws={"size": FS - 3},
cbar_kws={"label": IT["I"] + SUB["h"] + " / A", "shrink": 0.85},
xticklabels=orders, yticklabels=[f"N{i+1}" for i in range(6)], ax=ax)
ax.tick_params(direction="in", length=2.5, width=0.5)
ax.set_xlabel("谐波次数 " + IT["h"])
ax.set_ylabel("节点")
save(fig, "21_热图", "21_热图_谐波耦合矩阵")
def hm_05():
"""方案评估矩阵:多指标归一后比较优劣。"""
fig, ax = new_fig(left=0.22, bottom=0.24, right=0.88)
rng = np.random.default_rng(2105)
plans = ["原状", "方案一", "方案二", "方案三"]
metrics = ["线损率", "投资", "效率", "可靠性", "运维"]
M = np.array([[0.42, 0.12, 0.55, 0.61, 0.48],
[0.68, 0.58, 0.71, 0.74, 0.62],
[0.82, 0.46, 0.85, 0.80, 0.78],
[0.91, 0.66, 0.93, 0.86, 0.84]])
M = M + rng.normal(0, 0.015, M.shape)
sns.heatmap(M, annot=True, fmt=".2f", cmap=SEQ, vmin=0, vmax=1,
linewidths=0.4, linecolor="white",
annot_kws={"size": FS - 3},
cbar_kws={"label": "归一化得分", "shrink": 0.85},
xticklabels=metrics, yticklabels=plans, ax=ax)
ax.tick_params(direction="in", length=2.5, width=0.5)
ax.set_xlabel("评估指标")
ax.set_ylabel("方案")
save(fig, "21_热图", "21_热图_方案评估矩阵")
说明
- axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。

浙公网安备 33010602011771号