上机实验

实验目的#

  1. 熟练掌握 Matplotlib 面向对象接口(fig, ax = plt.subplots())的绘图流程。
  2. 掌握跨平台中英文字体(MathText)的学术化规范配置。
  3. 能够独立完成多子图(上下排版)的创建,并实现共享坐标轴。
  4. 掌握辅助线(警戒线)、数据高亮填充及图表的高清矢量图导出。

实验工程背景#

在某煤矿 102 工作面的回采过程中,随着采煤机的推进,前方的煤岩体受采动应力(地应力)影响会发生微破裂,从而释放微震能量;破裂同时会导致煤体透气性突然增加,引发瓦斯的大量涌出。

安全工程师的核心任务之一,就是寻找“岩体微震破裂”与“瓦斯涌出高峰”之间的迟滞时间差,从而建立煤与瓦斯突出的预警模型。

本次实验提供了 102 工作面连续 12 天的微震日总能量与回风巷瓦斯浓度的监测数据。请你补全给定的 Python 脚本,将这两种不同量纲的数据绘制在同一张时间轴上进行对析。

实验任务与步骤#

本实验为你提供了一段“半成品”脚手架代码。请在你的编辑器(如 VS Code)中新建一个文件 disaster_warning.py,将下方代码复制进去,并根据提示补全带有 [TODO] 标记的代码行。

具体任务:

  • 任务 1:在上方 ax1 绘制微震能量的柱状图 (Bar),用颜色区分视觉。
  • 任务 2:在下方 ax2 绘制瓦斯浓度的折线图 (Plot)
  • 任务 3:在瓦斯浓度图上,添加一条位于 $0.8%$ 处的红色虚线作为“预警线”,并将 $0.8%$ 以上的区域用淡红色填充。
  • 任务 4:使用自动紧凑排版,并将最终图表导出为 102_warning_chart.pdf

脚手架代码(请补全)#

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:102工作面监测数据录入
# ==========================================
days = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] # 回采天数
energy = [1.2, 1.5, 4.8, 8.5, 2.1, 1.8, 5.5, 9.2, 3.0, 1.5, 1.2, 1.0] # 微震总能量 (10^4 J)
gas = [0.3, 0.35, 0.38, 0.65, 0.85, 0.92, 0.5, 0.68, 0.88, 0.4, 0.35, 0.3] # 瓦斯浓度 (%)

# ==========================================
# 步骤 3:创建多子图布局
# ==========================================
# [TODO 1] 创建 2 行 1 列的子图,图形大小设为 (8, 6),并让上下图共享 X 轴
fig, (ax1, ax2) = plt.subplots(nrows=_____, ncols=_____, figsize=(8, 6), sharex=_____)

# ==========================================
# 步骤 4:操作上半区 (ax1) - 微震能量柱状图
# ==========================================
# [TODO 2] 用 ax1 绘制柱状图 (bar),数据为 days 和 energy,颜色设为 'gray',边缘颜色设为 'black'
ax1._____(days, energy, color='gray', edgecolor='black', label="微震日总能量")

# 完善 ax1 细节
ax1.set_title(r"102工作面采动微震与瓦斯涌出对析", fontsize=14)
ax1.set_ylabel(r"微震能量 $E$ ($10^4\,\mathrm{J}$)")
ax1.grid(axis='y', linestyle='--', alpha=0.7)
ax1.legend(loc='upper right')

# ==========================================
# 步骤 5:操作下半区 (ax2) - 瓦斯浓度折线图及预警
# ==========================================
# [TODO 3] 用 ax2 绘制折线图 (plot),数据为 days 和 gas,颜色设为 '#d62728',线宽为 2,标记为 'o'
ax2._____(_____, _____, color='#d62728', linewidth=2, marker='o', label="瓦斯绝对浓度")

# [TODO 4] 用 axhline 在 0.8 处画一条红色 (red)、虚线 (--) 的水平警戒线
ax2._____(y=0.8, color='____', linestyle='____', label="瓦斯预警阈值 (0.8%)")

# [TODO 5] 用 axhspan 将 0.8 到 1.0 的区域填充为红色,透明度 alpha=0.1
ax2._____(ymin=_____, ymax=1.0, color='red', alpha=_____)

# 完善 ax2 细节
ax2.set_xlabel(r"回采时间 $t$ ($\mathrm{d}$)")
ax2.set_ylabel(r"瓦斯浓度 $C$ ($\%$)")
ax2.grid(True, linestyle=':', alpha=0.6)
ax2.legend(loc='upper left')

# ==========================================
# 步骤 6:排版与导出
# ==========================================
# [TODO 6] 调用自动紧凑排版,防止标题和坐标轴标签重叠
fig._____()

# [TODO 7] 将图形导出为 PDF 矢量图,文件名为 '102_warning_chart.pdf',并紧凑裁剪 (bbox_inches="tight")
fig._____("102_warning_chart.pdf", bbox_inches="tight")

plt.show()

实验讨论与思考#

完成代码编写并看到输出的图表后,结合专业背景思考以下问题:

  1. 观察上下两张图的峰谷对应关系。微震能量的爆发期(如第 4 天、第 8 天)与瓦斯浓度的爆发期(如第 5-6 天、第 9 天)在时间上呈现什么规律?
  2. 如果你要写一段简单的 if-else Python 代码,利用昨天的微震数据来预测今天的瓦斯超限风险,你该如何设计逻辑?
课后作业pandas:数据分析和处理工具