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