02 折线图 lineplot
这类图是什么
折线,自动按 x 聚合出均值并画 95% 置信带。
看什么:看时间趋势,带越宽说明该位置样本波动越大,不必自己算分位数。
5 个案例
02-1 四季日负荷曲线:自动按小时聚合出均值与置信带
同一小时有多天样本时,seaborn 自动画均值线并叠加 95% 置信带,不必自己算分位数;带越宽说明该时段日间波动越大。

02-2 三种天气的光伏出力日出线

02-3 三个测点的母线电压日曲线

02-4 不同月份变压器顶层油温的日内变化

02-5 风电出力随时间的分风速段曲线

代码
5 个函数取自 code/第一批_关系图261107.py。关键约束:不调用 sns.set_theme(),否则 font.family 被改成 Arial,中文会变方框;版式由 code/公共配置261107.py 里的 setup_cn_style() 与 save() / save_grid() 统一接管。
# 摘自 code/第一批_关系图261107.py
def ln_01():
"""四季日负荷曲线:自动按小时聚合出均值与置信带。
同一小时有多天样本时,seaborn 自动画均值线并叠加 95% 置信带,
不必自己算分位数;带越宽说明该时段日间波动越大。
"""
fig, ax = new_fig()
rng = np.random.default_rng(201)
rows = []
for season, amp, base in [("春季", 150, 460), ("夏季", 210, 520), ("冬季", 175, 490)]:
for day in range(12):
for h in range(0, 24):
p = base + amp * np.exp(-((h - 10) / 3.2) ** 2) \
+ (amp + 30) * np.exp(-((h - 17) / 2.8) ** 2) + rng.normal(0, 26)
rows.append((season, float(h), p))
df = pd.DataFrame(rows, columns=["季节", "时刻", "负荷"])
sns.lineplot(data=df, x="时刻", y="负荷", hue="季节", ax=ax,
palette=PALETTE3, lw=1.0, errorbar=("ci", 95))
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("有功负荷 " + IT["P"] + " / kW")
ax.set_xlim(0, 23)
ax.margins(y=0.20)
legend(ax, "upper left", ncol=2)
save(fig, "02_折线图", "02_折线图_四季日负荷")
def ln_02():
"""三种天气的光伏出力日出线。"""
fig, ax = new_fig()
rng = np.random.default_rng(202)
rows = []
for weather, k in [("晴天", 1.0), ("多云", 0.62), ("阴天", 0.24)]:
for h in np.arange(6, 19, 0.5):
p = k * 880 * np.sin((h - 6) / 13 * np.pi) ** 1.3 + rng.normal(0, 12)
rows.append((weather, h, max(p, 0)))
df = pd.DataFrame(rows, columns=["天气", "时刻", "出力"])
sns.lineplot(data=df, x="时刻", y="出力", hue="天气", ax=ax,
palette=PALETTE3, lw=1.0, marker="o", ms=3)
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("有功出力 " + IT["P"] + " / kW")
ax.set_xlim(6, 18.5)
ax.set_ylim(-40, 1020)
legend(ax, "upper left", ncol=1)
save(fig, "02_折线图", "02_折线图_三种天气光伏出力")
def ln_03():
"""三个测点的母线电压日曲线。"""
fig, ax = new_fig()
rng = np.random.default_rng(203)
rows = []
for pt, mu in [("Ⅰ 段", 10.12), ("Ⅱ 段", 10.04), ("Ⅲ 段", 9.96)]:
for h in np.arange(0, 24.5, 0.5):
u = mu + 0.10 * np.sin((h - 8) / 24 * 2 * np.pi) + rng.normal(0, 0.012)
rows.append((pt, h, u))
df = pd.DataFrame(rows, columns=["测点", "时刻", "电压"])
sns.lineplot(data=df, x="时刻", y="电压", hue="测点", ax=ax,
palette=PALETTE3, lw=1.0)
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("母线电压 " + IT["U"] + " / kV")
ax.set_xlim(0, 24)
ax.margins(y=0.22)
legend(ax, "lower left", ncol=3)
save(fig, "02_折线图", "02_折线图_三测点母线电压")
def ln_04():
"""不同月份变压器顶层油温的日内变化。"""
fig, ax = new_fig()
rng = np.random.default_rng(204)
rows = []
for month, base in [("1 月", 42), ("4 月", 51), ("7 月", 63)]:
for h in np.arange(0, 24.5, 0.5):
t = base + 7 * np.exp(-((h - 15) / 4.0) ** 2) + rng.normal(0, 0.8)
rows.append((month, h, t))
df = pd.DataFrame(rows, columns=["月份", "时刻", "油温"])
sns.lineplot(data=df, x="时刻", y="油温", hue="月份", ax=ax,
palette=PALETTE3, lw=1.0)
ax.axhline(75, color=C2, lw=0.8, ls="--")
ax.set_xlabel("时刻 " + IT["t"] + " / h")
ax.set_ylabel("顶层油温 " + IT["T"] + " / °C")
ax.set_xlim(0, 24)
ax.set_ylim(34, 84)
legend(ax, "upper left", ncol=2)
save(fig, "02_折线图", "02_折线图_变压器油温日变化")
def ln_05():
"""风电出力随时间的分风速段曲线。"""
fig, ax = new_fig()
rng = np.random.default_rng(205)
rows = []
for seg, lo, hi in [("低风速", 3, 7), ("中风速", 7, 11), ("高风速", 11, 16)]:
for d in range(1, 31):
p = (lo + hi) / 2 * 42 + rng.normal(0, 55)
rows.append((seg, d, max(p, 0)))
df = pd.DataFrame(rows, columns=["风速段", "日序", "出力"])
sns.lineplot(data=df, x="日序", y="出力", hue="风速段", ax=ax,
palette=PALETTE3, lw=1.0, errorbar=None)
ax.set_xlabel("日序 " + IT["t"] + " / d")
ax.set_ylabel("风电出力 " + IT["P"] + " / kW")
ax.set_xlim(1, 30)
ax.margins(y=0.20)
legend(ax, "upper right", ncol=1)
save(fig, "02_折线图", "02_折线图_风电出力分风速段")
说明
- axes 级图 1181×944 px;figure 级多轴图按内容取 1100~1470 px 宽。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定。
浙公网安备 33010602011771号