22 聚类热图 clustermap
22 聚类热图 clustermap
这类图是什么
先层次聚类再排序,附行列树状图。
看什么:发现哪些对象行为相似,普通热图看不出这层结构。
5 个案例
22-1 节点电压行为的聚类热图:相似节点自动归为一组
clustermap 先做层次聚类再排序,树状图显示合并过程。左侧枝权越早合并的节点,电压行为越相似——这是普通热图看不出的一层结构。

22-2 负荷模式的聚类热图:把 20 天的日曲线自动分组

22-3 谐波源的聚类热图:不同次谐波在哪些节点同步出现

22-4 馈线相似性聚类:哪几条馈线的用电行为接近

22-5 气象与负荷指标的聚类热图:相关结构自动分组

代码
5 个函数取自 code/第四批_回归与矩阵261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。
# 摘自 code/第四批_回归与矩阵261107.py
def cm_01():
"""节点电压行为的聚类热图:相似节点自动归为一组。
clustermap 先做层次聚类再排序,树状图显示合并过程。左侧枝权越早合并的节点,
电压行为越相似——这是普通热图看不出的一层结构。
"""
rng = np.random.default_rng(2201)
rows = []
for i in range(12):
base = 10.15 - 0.02 * i
prof = base + 0.10 * np.sin((np.arange(24) - 8 - i * 0.3) / 24 * 2 * np.pi) \
+ rng.normal(0, 0.02, 24)
rows.append(prof)
M = np.array(rows)
g = sns.clustermap(M, cmap=SEQ, method="average", metric="correlation",
col_cluster=False, linewidths=0.2, linecolor="white",
figsize=(4.7, 4.5), cbar_pos=(0.02, 0.74, 0.045, 0.15),
cbar_kws={"label": ""},
xticklabels=4, yticklabels=2)
g.ax_heatmap.set_xlabel("时刻 " + IT["t"] + " / h")
g.ax_heatmap.set_ylabel("节点编号")
g.ax_cbar.set_title("kV", fontsize=FS - 2, pad=3)
save_grid(g, "22_聚类热图", "22_聚类热图_节点电压行为", multi=True, w_mm=119, h_mm=114)
def cm_02():
"""负荷模式的聚类热图:把 20 天的日曲线自动分组。"""
rng = np.random.default_rng(2202)
rows = []
for d in range(20):
shape = rng.choice([0, 1])
if shape == 0:
prof = 430 + 180 * np.exp(-((np.arange(24) - 10) / 3.4) ** 2) + rng.normal(0, 18, 24)
else:
prof = 430 + 230 * np.exp(-((np.arange(24) - 18) / 3.0) ** 2) + rng.normal(0, 18, 24)
rows.append(prof)
M = np.array(rows)
g = sns.clustermap(M, cmap=SEQ, method="ward", metric="euclidean",
col_cluster=False, linewidths=0.2, linecolor="white",
figsize=(4.7, 4.5), cbar_pos=(0.02, 0.74, 0.045, 0.15),
cbar_kws={"label": ""},
xticklabels=4, yticklabels=4)
g.ax_heatmap.set_xlabel("时刻 " + IT["t"] + " / h")
g.ax_heatmap.set_ylabel("日序 " + IT["t"] + " / d")
g.ax_cbar.set_title("kW", fontsize=FS - 2, pad=3)
save_grid(g, "22_聚类热图", "22_聚类热图_负荷模式分组", multi=True, w_mm=119, h_mm=114)
def cm_03():
"""谐波源的聚类热图:不同次谐波在哪些节点同步出现。"""
rng = np.random.default_rng(2203)
orders = [3, 5, 7, 9, 11]
rows = []
for o in orders:
rows.append(30 / o ** 0.9 * (1 + 0.5 * rng.random(10)))
M = np.array(rows)
g = sns.clustermap(M, cmap=SEQ, method="average", metric="euclidean",
linewidths=0.3, linecolor="white", figsize=(4.7, 4.4), cbar_pos=(0.02, 0.74, 0.045, 0.15),
cbar_kws={"label": ""},
xticklabels=[f"N{i+1}" for i in range(10)],
yticklabels=[f"{o} 次" for o in orders])
g.ax_heatmap.set_xlabel("节点")
g.ax_heatmap.set_ylabel("谐波次数 " + IT["h"])
g.ax_cbar.set_title("A", fontsize=FS - 2, pad=3)
save_grid(g, "22_聚类热图", "22_聚类热图_谐波源分布", multi=True, w_mm=119, h_mm=114)
def cm_04():
"""馈线相似性聚类:哪几条馈线的用电行为接近。"""
rng = np.random.default_rng(2204)
rows = []
for i in range(8):
base = 260 + 30 * i
prof = base + 0.4 * base * np.exp(-((np.arange(24) - 10) / 3.2) ** 2) \
+ rng.normal(0, 14, 24)
rows.append(prof)
M = np.array(rows)
g = sns.clustermap(M, cmap=SEQ, method="average", metric="correlation",
col_cluster=False, linewidths=0.2, linecolor="white",
figsize=(4.7, 4.4), cbar_pos=(0.02, 0.74, 0.045, 0.15),
cbar_kws={"label": ""},
xticklabels=4, yticklabels=[f"L{i+1}" for i in range(8)])
g.ax_heatmap.set_xlabel("时刻 " + IT["t"] + " / h")
g.ax_heatmap.set_ylabel("馈线")
g.ax_cbar.set_title("A", fontsize=FS - 2, pad=3)
save_grid(g, "22_聚类热图", "22_聚类热图_馈线相似性", multi=True, w_mm=119, h_mm=114)
def cm_05():
"""气象与负荷指标的聚类热图:相关结构自动分组。"""
rng = np.random.default_rng(2205)
names = ["气温", "湿度", "风速", "辐照", "负荷", "光伏"]
A = rng.normal(0, 1, (6, 300))
A[4] = 0.72 * A[0] + 0.5 * rng.normal(0, 1, 300)
A[3] = 0.86 * A[5] + 0.4 * rng.normal(0, 1, 300)
A[2] = -0.35 * A[1] + 0.8 * rng.normal(0, 1, 300)
Cm = np.corrcoef(A)
g = sns.clustermap(Cm, cmap=DIV, vmin=-1, vmax=1, method="average",
linewidths=0.4, linecolor="white", figsize=(4.7, 4.5), cbar_pos=(0.02, 0.74, 0.045, 0.15),
cbar_kws={"label": ""},
xticklabels=names, yticklabels=names)
g.ax_heatmap.set_xlabel("指标")
g.ax_heatmap.set_ylabel("指标")
g.ax_cbar.set_title("r", fontsize=FS - 2, pad=3)
save_grid(g, "22_聚类热图", "22_聚类热图_气象负荷相关结构", multi=True, w_mm=119, h_mm=114)
说明
- axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。

浙公网安备 33010602011771号