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