24 联合分布 jointplot
24 联合分布 jointplot
这类图是什么
主图散点/密度 + 边缘分布,kind 可换 reg/kde/hex。
看什么:同时看联合趋势与两个单变量分布,不必画三张图。
5 个案例
24-1 负荷与气温的联合分布:主图散点 + 边缘分布
jointplot 把两个变量的散点与各自的边缘分布放在一起,既能看联合趋势(主图),也能看单变量形状(顶部与右侧),不必画三张图。

24-2 带回归线的联合分布:趋势与边缘一图看完

24-3 密度等高线形式的联合分布:看密度中心

24-4 六边形分箱的联合分布:大样本更干净

24-5 按方案分组的联合分布:两组密度叠在一张图

代码
5 个函数取自 code/第五批_组合网格261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。
# 摘自 code/第五批_组合网格261107.py
def jp_01():
"""负荷与气温的联合分布:主图散点 + 边缘分布。
jointplot 把两个变量的散点与各自的边缘分布放在一起,
既能看联合趋势(主图),也能看单变量形状(顶部与右侧),不必画三张图。
"""
rng = np.random.default_rng(2401)
t = rng.normal(28, 8, 400)
p = 380 + 9.5 * (t - 20) + rng.normal(0, 50, 400)
df = pd.DataFrame({"气温": t, "负荷": p})
g = sns.jointplot(data=df, x="气温", y="负荷", kind="scatter",
color=C1, height=4.1,
joint_kws={"s": 12, "edgecolor": "white", "linewidths": 0.2},
marginal_kws={"fill": True, "alpha": 0.45, "color": C5})
g.ax_joint.set_xlabel("气温 " + IT["T"] + " / °C")
g.ax_joint.set_ylabel("有功负荷 " + IT["P"] + " / kW")
g.ax_marg_x.set_xlabel("")
g.ax_marg_y.set_ylabel("")
save_grid(g, "24_联合分布", "24_联合分布_负荷与气温", multi=True,
w_mm=106, h_mm=104,
adjust=dict(left=0.135, bottom=0.11, right=0.95, top=0.94))
def jp_02():
"""带回归线的联合分布:趋势与边缘一图看完。"""
rng = np.random.default_rng(2402)
b = rng.uniform(0.15, 1.0, 350)
eta = 98.4 - 1.5 * (1 - b) ** 1.4 + rng.normal(0, 0.08, 350)
df = pd.DataFrame({"负载率": b, "效率": eta})
g = sns.jointplot(data=df, x="负载率", y="效率", kind="reg", color=C3,
height=4.1,
joint_kws={"scatter_kws": {"s": 11, "edgecolor": "white",
"linewidths": 0.2},
"line_kws": {"lw": 1.1}},
marginal_kws={"fill": True, "alpha": 0.42, "color": C3})
g.ax_joint.set_xlabel("负载率 " + IT["beta"])
g.ax_joint.set_ylabel("效率 " + IT["eta"] + " / %")
g.ax_marg_x.set_xlabel("")
g.ax_marg_y.set_ylabel("")
save_grid(g, "24_联合分布", "24_联合分布_负载率与效率", multi=True,
w_mm=106, h_mm=104,
adjust=dict(left=0.135, bottom=0.11, right=0.95, top=0.94))
def jp_03():
"""密度等高线形式的联合分布:看密度中心。"""
rng = np.random.default_rng(2403)
v = rng.weibull(2.1, 400) * 9.5
pw = np.clip(0.42 * v ** 3, 0, 1650) + rng.normal(0, 90, 400)
df = pd.DataFrame({"风速": v, "出力": np.clip(pw, 0, None)})
g = sns.jointplot(data=df, x="风速", y="出力", kind="kde", fill=True,
cmap="Blues", levels=10, height=4.1, thresh=0.05,
joint_kws={},
marginal_kws={"fill": True, "color": C5, "alpha": 0.45})
g.ax_joint.set_xlabel("风速 " + IT["v"] + " / (m/s)")
g.ax_joint.set_ylabel("风电出力 " + IT["P"] + " / kW")
g.ax_marg_x.set_xlabel("")
g.ax_marg_y.set_ylabel("")
save_grid(g, "24_联合分布", "24_联合分布_风速与出力", multi=True,
w_mm=106, h_mm=104,
adjust=dict(left=0.135, bottom=0.11, right=0.95, top=0.94))
def jp_04():
"""六边形分箱的联合分布:大样本更干净。"""
rng = np.random.default_rng(2404)
i = rng.gamma(9, 32, 6000)
u = 10.18 - 0.00095 * i + rng.normal(0, 0.05, 6000)
df = pd.DataFrame({"电流": i, "电压": u})
g = sns.jointplot(data=df, x="电流", y="电压", kind="hex", color=C5,
height=4.1, joint_kws={},
marginal_kws={"fill": True, "alpha": 0.45, "color": C5})
g.ax_joint.set_xlabel("负荷电流 " + IT["I"] + " / A")
g.ax_joint.set_ylabel("母线电压 " + IT["U"] + " / kV")
g.ax_marg_x.set_xlabel("")
g.ax_marg_y.set_ylabel("")
save_grid(g, "24_联合分布", "24_联合分布_电流与电压", multi=True,
w_mm=106, h_mm=104,
adjust=dict(left=0.135, bottom=0.11, right=0.95, top=0.94))
def jp_05():
"""按方案分组的联合分布:两组密度叠在一张图。"""
rng = np.random.default_rng(2405)
rows = []
for plan, mu in [("方案 A", 0.872), ("方案 B", 0.889)]:
eff = rng.normal(mu, 0.03, 300)
rows.append(pd.DataFrame({"效率": eff,
"温升": 30 + 4200 * (eff - 0.80) + rng.normal(0, 1.6, 300),
"方案": plan}))
df = pd.concat(rows, ignore_index=True)
g = sns.jointplot(data=df, x="效率", y="温升", hue="方案",
palette=[C5, C3], height=4.1,
joint_kws={"s": 10, "edgecolor": "white", "linewidths": 0.2})
g.ax_joint.set_xlabel("系统综合效率 " + IT["eta"])
g.ax_joint.set_ylabel("绕组温升 " + IT["T"] + " / K")
g.ax_marg_x.set_xlabel("")
g.ax_marg_y.set_ylabel("")
save_grid(g, "24_联合分布", "24_联合分布_按方案分组", multi=True,
w_mm=110, h_mm=104,
adjust=dict(left=0.135, bottom=0.11, right=0.95, top=0.94))
说明
- axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。

浙公网安备 33010602011771号