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 量级的仿真算例,随机种子固定。
浙公网安备 33010602011771号