图表元素与样式定制

如果说上一节讲授的三大基础图表搭建了数据可视化的“骨架”,那么本节要讨论的元素与样式定制,就是为图表注入“灵魂”。

在安全工程的学术论文和技术评估报告中,一张优秀的图表绝不仅仅是把数据画出来而已。它必须能够引导读者的视线,突出工程中的关键节点(如安全阈值、破坏临界点、突变时间点)。这要求我们能够像使用手术刀一样,精准地微调坐标系内的每一个视觉元素。

本节我们将学习如何利用面向对象的方法,添加安全基准线、高亮危险区域,并对异常数据点进行精准注释。

坐标轴范围与刻度精修#

Matplotlib 默认的底层算法会自动根据数据大小为您分配坐标轴的范围(Limits)和刻度(Ticks)。但在工程制图中,机器的自动选择往往不符合行业规范。例如,计算出的浓度最高为 0.82%,机器可能会把 Y 轴最大值设为 0.85%,但在工程报告中,我们通常需要将其强制取整到 1.0%。

  • 限定范围:使用 ax.set_xlim(min, max)ax.set_ylim(min, max)
  • 强制指定刻度:使用 ax.set_xticks([列表])ax.set_yticks([列表])

警戒线与高亮区域(安全工程极高频应用)#

在安全工程中,我们往往最关心的不是正常数据,而是数据是否越过了某个“红线”(如瓦斯报警浓度、巷道最大允许变形量)。

  • 水平/垂直参考线

  • ax.axhline(y, ...):在指定的 y 坐标处画一条横穿整个图表的水平线。

  • ax.axvline(x, ...):画一条垂直线。

  • 区域填充(高亮风险区)

  • ax.axhspan(ymin, ymax, ...):在 ymin 到 ymax 之间填充一条贯穿全图的水平色带,非常适合用来表示“危险区间”或“安全阈值带”。

数据注释(Annotation)#

当监测数据中出现异常峰值或灾变前兆时,我们需要在图表中用箭头将其明确指出来。

  • 添加注释:使用 ax.annotate(text, xy, xytext, arrowprops)
  • text:要显示的文本。
  • xy:箭头的尖端指向的坐标(即异常数据点的坐标)。
  • xytext:文本所在的坐标。
  • arrowprops:一个字典,用于控制箭头的样式和颜色。

综合实战:打造出版级“瓦斯异常波动分析图”#

让我们将上述三个高阶技巧融合,处理一段虚拟的矿井瓦斯浓度连续监测数据。

在这段代码中,我们将展示什么是“计算思维在制图中的体现”——我们将安全标准(瓦斯浓度超 1.0% 报警)具象化为一条红色的水平警戒线,并将 1.0% 以上的区域用淡红色填充为“危险区”,最后用箭头精准指出引发报警的异常点。

请运行以下代码,体会如何将一张普通的折线图,升级为能够直接贴入工程事故调查报告的高级图表:

import matplotlib.pyplot as plt

# --- 1. 学术环境标准配置 ---
plt.rcParams["font.family"] = "serif"
plt.rcParams["font.serif"] = ["SimSun", "Songti SC", "Noto Serif SC"]
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["mathtext.fontset"] = "stix"

# --- 2. 准备数据 ---
time = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]  # 监测时间 t (min)
gas = [0.3, 0.35, 0.4, 0.45, 1.2, 0.85, 0.6, 0.5, 0.4, 0.35]  # 瓦斯浓度 C (%)

fig, ax = plt.subplots(figsize=(8, 5))

# --- 3. 基础折线绘制 ---
ax.plot(time, gas, color="#1f77b4", marker="o", linewidth=2, label="传感器实测值")

# --- 4. 样式定制核心区 ---
# 4.1 精修坐标轴范围与刻度
ax.set_ylim(0, 1.5)  # 强制 Y 轴从 0 开始,到 1.5 结束
ax.set_xticks([0, 15, 30, 45, 60, 75, 90])  # 强制 X 轴每隔 15 分钟显示一个刻度

# 4.2 添加警戒线与危险区域高亮
alarm_threshold = 1.0
# 画水平红色虚线警戒线
ax.axhline(
    alarm_threshold,
    color="red",
    linestyle="--",
    linewidth=1.5,
    label="法定报警阈值 (1.0%)",
)
# 填充 1.0 到 1.5 之间的区域为淡红色危险区 (alpha=0.1 控制极高透明度,以免喧宾夺主)
ax.axhspan(alarm_threshold, 1.5, color="red", alpha=0.1)

# 4.3 异常数据点注释
# 找到最高点的坐标 (x=40, y=1.2)
ax.annotate(
    r"异常涌出突变点",
    xy=(40, 1.2),  # 箭头指向的数据点真实坐标
    xytext=(50, 1.35),  # 注释文本放置的坐标
    color="darkred",  # 文本颜色
    fontsize=11,
    weight="bold",  # 文本加粗
    arrowprops=dict(
        arrowstyle="->", color="darkred", connectionstyle="arc3,rad=0.2"
    ),  # 带有一定弧度的箭头
)

# --- 5. 完善其他学术细节 ---
ax.set_title(r"综采工作面瓦斯浓度异常波动分析", fontsize=14, pad=15)
ax.set_xlabel(r"监测时间 $t$ ($\mathrm{min}$)", fontsize=12)
ax.set_ylabel(r"瓦斯绝对浓度 $C$ ($\%$)", fontsize=12)

ax.grid(True, linestyle=":", alpha=0.6)
ax.legend(loc="upper right")

plt.show()

小结#

通过本节的实战,你可以明显感受到面向对象编程(OOP)的强大控制力:ax 就像一个忠实的执行者,你可以逐行命令它画线(plot)、画水平警戒线(axhline)、高亮背景(axhspan)、画箭头(annotate)。

在安全工程专业的毕业设计或学术论文中,评委和审稿人判断一张图表好坏的潜规则往往就在于这些细节:你是否主动标出了危险阈值?你是否指出了突变点?坐标轴的刻度是否符合工程规范? 掌握了这些定制技巧,你的图表就不再是冷冰冰的数据罗列,而是具备了工程“灵魂”的分析利器。

常用工程图表多图排版与高质量输出