如果说上一节讲授的三大基础图表搭建了数据可视化的“骨架”,那么本节要讨论的元素与样式定制,就是为图表注入“灵魂”。
在安全工程的学术论文和技术评估报告中,一张优秀的图表绝不仅仅是把数据画出来而已。它必须能够引导读者的视线,突出工程中的关键节点(如安全阈值、破坏临界点、突变时间点)。这要求我们能够像使用手术刀一样,精准地微调坐标系内的每一个视觉元素。
本节我们将学习如何利用面向对象的方法,添加安全基准线、高亮危险区域,并对异常数据点进行精准注释。
坐标轴范围与刻度精修#
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)。
在安全工程专业的毕业设计或学术论文中,评委和审稿人判断一张图表好坏的潜规则往往就在于这些细节:你是否主动标出了危险阈值?你是否指出了突变点?坐标轴的刻度是否符合工程规范? 掌握了这些定制技巧,你的图表就不再是冷冰冰的数据罗列,而是具备了工程“灵魂”的分析利器。