37 雨云图

37 雨云图

用途

半小提琴 + 箱线 + 散点三合一,一图看清分布、统计量与原始点。

示例(5 张)

37-1 各季节负荷的雨云图(半小提琴 + 箱线 + 散点)

各季节负荷的雨云图(半小提琴 + 箱线 + 散点)

37-2 各馈线电流的雨云图

各馈线电流的雨云图

37-3 四种方案效率的雨云图

四种方案效率的雨云图

37-4 各时段功率因数的雨云图

各时段功率因数的雨云图

37-5 各月光伏出力的雨云图

各月光伏出力的雨云图

代码

以下 5 个函数取自 code/第六批_组合图261107.py,直接调用即可出图。样式(宋体 + Times、10 磅、刻度朝内四边、留白自检)由 code/公共配置261107.py 的 setup_cn_style() 和 save() 统一提供,本节不再重复。

# 摘自 code/第六批_组合图261107.py

def rc_01():
    """各季节负荷的雨云图(半小提琴 + 箱线 + 散点)。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(3701)
    data = [rng.normal(520, 88, 200), rng.normal(610, 96, 200),
            rng.normal(560, 82, 200), rng.normal(665, 104, 200)]
    names = ["春季", "夏季", "秋季", "冬季"]
    for i, d in enumerate(data):
        parts = ax.violinplot([d], positions=[i], widths=0.7,
                              showextrema=False, showmedians=False)
        body = parts["bodies"][0]
        verts = body.get_paths()[0].vertices
        verts[:, 0] = np.clip(verts[:, 0], None, i)
        body.set_facecolor(PALETTE5[i])
        body.set_edgecolor("0.35")
        body.set_linewidth(0.5)
        body.set_alpha(0.85)
        ax.boxplot([d], positions=[i + 0.18], widths=0.12, patch_artist=True,
                   showfliers=False,
                   boxprops={"facecolor": "white", "edgecolor": "0.3",
                             "linewidth": 0.6},
                   medianprops={"color": C2, "linewidth": 1.0},
                   whiskerprops={"linewidth": 0.5},
                   capprops={"linewidth": 0.5})
        jit = rng.uniform(-0.05, 0.05, 60)
        ax.scatter(np.full(60, i - 0.32) + jit, rng.choice(d, 60), s=3,
                   color=C4, alpha=0.45, linewidths=0)
    ax.set_xticks(range(4))
    ax.set_xticklabels(names)
    ax.set_xlabel("季节")
    ax.set_ylabel("有功负荷 " + IT["P"] + " / kW")
    ax.set_xlim(-0.6, 3.7)
    save(fig, "37_雨云图", "37_雨云图_各季节负荷")

def rc_02():
    """各馈线电流的雨云图。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(3702)
    data = [rng.gamma(9, 32, 200), rng.gamma(11, 26, 200),
            rng.gamma(8, 42, 200), rng.gamma(13, 22, 200)]
    for i, d in enumerate(data):
        parts = ax.violinplot([d], positions=[i], widths=0.7,
                              showextrema=False, showmedians=False)
        body = parts["bodies"][0]
        verts = body.get_paths()[0].vertices
        verts[:, 0] = np.clip(verts[:, 0], None, i)
        body.set_facecolor(PALETTE5[i])
        body.set_edgecolor("0.35")
        body.set_linewidth(0.5)
        body.set_alpha(0.85)
        ax.boxplot([d], positions=[i + 0.18], widths=0.12, patch_artist=True,
                   showfliers=False,
                   boxprops={"facecolor": "white", "edgecolor": "0.3",
                             "linewidth": 0.6},
                   medianprops={"color": C2, "linewidth": 1.0},
                   whiskerprops={"linewidth": 0.5},
                   capprops={"linewidth": 0.5})
        jit = rng.uniform(-0.05, 0.05, 60)
        ax.scatter(np.full(60, i - 0.32) + jit, rng.choice(d, 60), s=3,
                   color=C4, alpha=0.45, linewidths=0)
    ax.set_xticks(range(4))
    ax.set_xticklabels(["L1", "L2", "L3", "L4"])
    ax.set_xlabel("馈线")
    ax.set_ylabel("电流有效值 " + IT["I"] + " / A")
    ax.set_xlim(-0.6, 3.7)
    save(fig, "37_雨云图", "37_雨云图_各馈线电流")

def rc_03():
    """四种方案效率的雨云图。"""
    fig, ax = new_fig(left=0.21)
    rng = np.random.default_rng(3703)
    data = [rng.normal(0.86, 0.024, 200), rng.normal(0.89, 0.019, 200),
            rng.normal(0.91, 0.016, 200), rng.normal(0.92, 0.013, 200)]
    for i, d in enumerate(data):
        parts = ax.violinplot([d], positions=[i], widths=0.7,
                              showextrema=False, showmedians=False)
        body = parts["bodies"][0]
        verts = body.get_paths()[0].vertices
        verts[:, 0] = np.clip(verts[:, 0], None, i)
        body.set_facecolor(PALETTE4[i])
        body.set_edgecolor("0.35")
        body.set_linewidth(0.5)
        body.set_alpha(0.85)
        ax.boxplot([d], positions=[i + 0.18], widths=0.12, patch_artist=True,
                   showfliers=False,
                   boxprops={"facecolor": "white", "edgecolor": "0.3",
                             "linewidth": 0.6},
                   medianprops={"color": C2, "linewidth": 1.0},
                   whiskerprops={"linewidth": 0.5},
                   capprops={"linewidth": 0.5})
        jit = rng.uniform(-0.05, 0.05, 60)
        ax.scatter(np.full(60, i - 0.32) + jit, rng.choice(d, 60), s=3,
                   color=C4, alpha=0.45, linewidths=0)
    ax.set_xticks(range(4))
    ax.set_xticklabels(["策略一", "策略二", "策略三", "策略四"])
    ax.set_xlabel("调度策略")
    ax.set_ylabel("综合效率 " + IT["eta"])
    ax.set_xlim(-0.6, 3.7)
    save(fig, "37_雨云图", "37_雨云图_各方案效率")

def rc_04():
    """各时段功率因数的雨云图。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(3704)
    base = [0.87, 0.91, 0.86, 0.94]
    data = [rng.normal(b, 0.026, 200) for b in base]
    for i, d in enumerate(data):
        parts = ax.violinplot([d], positions=[i], widths=0.7,
                              showextrema=False, showmedians=False)
        body = parts["bodies"][0]
        verts = body.get_paths()[0].vertices
        verts[:, 0] = np.clip(verts[:, 0], None, i)
        body.set_facecolor(PALETTE5[i])
        body.set_edgecolor("0.35")
        body.set_linewidth(0.5)
        body.set_alpha(0.85)
        ax.boxplot([d], positions=[i + 0.18], widths=0.12, patch_artist=True,
                   showfliers=False,
                   boxprops={"facecolor": "white", "edgecolor": "0.3",
                             "linewidth": 0.6},
                   medianprops={"color": C2, "linewidth": 1.0},
                   whiskerprops={"linewidth": 0.5},
                   capprops={"linewidth": 0.5})
        jit = rng.uniform(-0.05, 0.05, 60)
        ax.scatter(np.full(60, i - 0.32) + jit, rng.choice(d, 60), s=3,
                   color=C4, alpha=0.45, linewidths=0)
    ax.axhline(0.90, color=C2, lw=0.7, ls="--")
    ax.set_xticks(range(4))
    ax.set_xticklabels(["0-6", "6-12", "12-18", "18-24"])
    ax.set_xlabel("时段 / h")
    ax.set_ylabel("功率因数 cos " + IT["phi"])
    ax.set_xlim(-0.6, 3.7)
    save(fig, "37_雨云图", "37_雨云图_各时段功率因数")

def rc_05():
    """各月光伏出力的雨云图。"""
    fig, ax = new_fig(left=0.19)
    rng = np.random.default_rng(3705)
    means = [210, 340, 470, 486]
    data = [rng.normal(m, m * 0.16, 200).clip(0) for m in means]
    for i, d in enumerate(data):
        parts = ax.violinplot([d], positions=[i], widths=0.7,
                              showextrema=False, showmedians=False)
        body = parts["bodies"][0]
        verts = body.get_paths()[0].vertices
        verts[:, 0] = np.clip(verts[:, 0], None, i)
        body.set_facecolor(PALETTE5[i])
        body.set_edgecolor("0.35")
        body.set_linewidth(0.5)
        body.set_alpha(0.85)
        ax.boxplot([d], positions=[i + 0.18], widths=0.12, patch_artist=True,
                   showfliers=False,
                   boxprops={"facecolor": "white", "edgecolor": "0.3",
                             "linewidth": 0.6},
                   medianprops={"color": C2, "linewidth": 1.0},
                   whiskerprops={"linewidth": 0.5},
                   capprops={"linewidth": 0.5})
        jit = rng.uniform(-0.05, 0.05, 60)
        ax.scatter(np.full(60, i - 0.32) + jit, rng.choice(d, 60), s=3,
                   color=C4, alpha=0.45, linewidths=0)
    ax.set_xticks(range(4))
    ax.set_xticklabels(["1 月", "4 月", "7 月", "10 月"])
    ax.set_xlabel("月份")
    ax.set_ylabel("日均出力 " + IT["P"] + " / kW")
    ax.set_xlim(-0.6, 3.7)
    save(fig, "37_雨云图", "37_雨云图_各月光伏出力")

说明

  • 图片尺寸 1181×944 px(100 mm × 80 mm @ 300 dpi),三维图为 1181×1122 px。
  • 图内不放标题,图题由本文件的二级/三级标题承担。
  • 数据为贴近广东实际量级的仿真算例,随机种子固定,重跑结果一致。
posted @ 2026-11-08 00:11  小青蛙电气  阅读(4)  评论(0)    收藏  举报