01 散点图 scatterplot

这类图是什么

两量关系的散点,支持 hue/style/size 语义映射,自动配色与图例。

看什么:看两个量的相关方向、强弱与聚类;按类别分色后可比较组间差异。

5 个案例

01-1 变压器负载率与效率:按冷却方式着色

hue 把三种冷却方式分开配色,同时给出统一图例——这是 seaborn 相对 matplotlib最直接的好处,不必为每组手写颜色和图例条目。

变压器负载率与效率:按冷却方式着色

01-2 光伏出力与辐照度:按季节着色并区分点型

hue 管颜色、style 管形状,两个语义维度同时编码,黑白打印时仍能靠形状区分。

光伏出力与辐照度:按季节着色并区分点型

01-3 负荷有功与无功:点大小表示功率因数水平

size 参数把第三个变量映射为点面积,一张图里同时读出三个量,不必再画第二张图或另配色条。

负荷有功与无功:点大小表示功率因数水平

01-4 电机转速与转矩:按供电电压等级分组

电机转速与转矩:按供电电压等级分组

01-5 电压偏差与三相不平衡度:按供电区域分色

电压偏差与三相不平衡度:按供电区域分色

代码

5 个函数取自 code/第一批_关系图261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。

# 摘自 code/第一批_关系图261107.py

def sc_01():
    """变压器负载率与效率:按冷却方式着色。

    hue 把三种冷却方式分开配色,同时给出统一图例——这是 seaborn 相对 matplotlib
    最直接的好处,不必为每组手写颜色和图例条目。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(101)
    parts = []
    for kind, base in [("油浸自冷", 98.3), ("油浸风冷", 98.7), ("干式", 97.9)]:
        b = rng.uniform(0.15, 1.0, 90)
        eta = base - 1.4 * (1 - b) ** 1.5 - 0.5 * b ** 2 + rng.normal(0, 0.06, 90)
        parts.append(pd.DataFrame({"负载率": b, "效率": eta, "冷却方式": kind}))
    df = pd.concat(parts, ignore_index=True)
    sns.scatterplot(data=df, x="负载率", y="效率", hue="冷却方式", ax=ax,
                    palette=PALETTE3, s=20, edgecolor="white", linewidth=0.3)
    ax.set_xlabel("负载率 " + IT["beta"])
    ax.set_ylabel("效率 " + IT["eta"] + " / %")
    ax.set_xlim(0.05, 1.06)
    ax.margins(y=0.18)
    legend(ax, "lower right", ncol=1)
    save(fig, "01_散点图", "01_散点图_负载率与效率")

def sc_02():
    """光伏出力与辐照度:按季节着色并区分点型。

    hue 管颜色、style 管形状,两个语义维度同时编码,黑白打印时仍能靠形状区分。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(102)
    rows = []
    for season, k, gmax in [("春季", 0.86, 780), ("夏季", 0.93, 1020), ("秋季", 0.90, 860)]:
        g = rng.uniform(0, gmax, 110)
        p = k * g + rng.normal(0, 16, 110)
        rows.append(pd.DataFrame({"辐照度": g, "出力": p, "季节": season}))
    df = pd.concat(rows, ignore_index=True)
    sns.scatterplot(data=df, x="辐照度", y="出力", hue="季节", style="季节",
                    ax=ax, palette=PALETTE3, s=22, edgecolor="white", linewidth=0.3)
    ax.set_xlabel("辐照度 " + IT["G"] + " / (W/m²)")
    ax.set_ylabel("有功出力 " + IT["P"] + " / kW")
    ax.set_xlim(-30, 1080)
    ax.margins(y=0.16)
    legend(ax, "upper left", ncol=1)
    save(fig, "01_散点图", "01_散点图_光伏出力与辐照度")

def sc_03():
    """负荷有功与无功:点大小表示功率因数水平。

    size 参数把第三个变量映射为点面积,一张图里同时读出三个量,
    不必再画第二张图或另配色条。
    """
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(103)
    rows = []
    for volt, pf0 in [("10 kV", 0.93), ("380 V", 0.88), ("220 V", 0.84)]:
        p = rng.uniform(120, 880, 90)
        pf = rng.uniform(pf0 - 0.05, pf0 + 0.05, 90)
        rows.append(pd.DataFrame({"有功": p, "无功": p * np.tan(np.arccos(pf)),
                                  "电压等级": volt}))
    df = pd.concat(rows, ignore_index=True)
    sns.scatterplot(data=df, x="有功", y="无功", hue="电压等级",
                    style="电压等级", palette=PALETTE3, ax=ax, s=22,
                    edgecolor="white", linewidth=0.3, alpha=0.88)
    ax.set_xlabel("有功功率 " + IT["P"] + " / kW")
    ax.set_ylabel("无功功率 " + IT["Q"] + " / kvar")
    ax.set_xlim(80, 950)
    ax.margins(y=0.18)
    legend_in(ax, "lower right")
    save(fig, "01_散点图", "01_散点图_有功无功与功率因数")

def sc_04():
    """电机转速与转矩:按供电电压等级分组。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(104)
    rows = []
    for volt, k in [("380 V", 1.0), ("400 V", 1.05), ("360 V", 0.92)]:
        n = rng.uniform(400, 1480, 80)
        tq = k * 2.1 * (1 - ((n - 1450) / 700) ** 2) + rng.normal(0, 0.05, 80)
        rows.append(pd.DataFrame({"转速": n, "转矩": tq, "电压等级": volt}))
    df = pd.concat(rows, ignore_index=True)
    sns.scatterplot(data=df, x="转速", y="转矩", hue="电压等级", ax=ax,
                    palette=PALETTE3, s=18, edgecolor="white", linewidth=0.3)
    ax.set_xlabel("转速 " + IT["n"] + " / (r/min)")
    ax.set_ylabel("电磁转矩 " + IT["T"] + " / (N·m)")
    ax.set_xlim(350, 1550)
    ax.margins(y=0.20)
    legend(ax, "lower left", ncol=1)
    save(fig, "01_散点图", "01_散点图_电机转速与转矩")

def sc_05():
    """电压偏差与三相不平衡度:按供电区域分色。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(105)
    rows = []
    for area, mu, sd in [("城区", 0.6, 1.8), ("郊区", 1.4, 2.6), ("农村", 2.8, 3.4)]:
        d = rng.normal(mu, sd, 110)
        ub = np.abs(rng.normal(1.2, 0.6, 110)) + 0.06 * np.abs(d)
        rows.append(pd.DataFrame({"电压偏差": d, "不平衡度": ub, "区域": area}))
    df = pd.concat(rows, ignore_index=True)
    sns.scatterplot(data=df, x="电压偏差", y="不平衡度", hue="区域", ax=ax,
                    palette=PALETTE3, s=20, edgecolor="white", linewidth=0.3)
    ax.axvline(7, color=C2, lw=0.7, ls="--")
    ax.axhline(2.0, color=C2, lw=0.7, ls=":")
    ax.set_xlabel("电压偏差 / %")
    ax.set_ylabel("三相不平衡度 / %")
    ax.set_xlim(-9, 13)
    ax.set_ylim(0, 5.2)
    legend(ax, "upper left", ncol=1)
    save(fig, "01_散点图", "01_散点图_电压偏差与不平衡度")

说明

  • axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
  • 图内不放标题,图题由本文件的标题承担。
  • 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。
posted on 2026-11-08 00:12  小青蛙电气  阅读(2)  评论(0)    收藏  举报