22 聚类热图 clustermap

22 聚类热图 clustermap

这类图是什么

先层次聚类再排序,附行列树状图。

看什么:发现哪些对象行为相似,普通热图看不出这层结构。

5 个案例

22-1 节点电压行为的聚类热图:相似节点自动归为一组

clustermap 先做层次聚类再排序,树状图显示合并过程。左侧枝权越早合并的节点,电压行为越相似——这是普通热图看不出的一层结构。

节点电压行为的聚类热图:相似节点自动归为一组

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

负荷模式的聚类热图:把 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 量级的仿真算例,随机种子固定。
posted @ 2026-11-08 08:32  小青蛙电气  阅读(4)  评论(0)    收藏  举报