常用工程图表

在商业数据分析或媒体报道中,你可能会看到诸如饼图、雷达图、玫瑰图等花里胡哨的可视化形式。但在硬核的传统工科(如安全、采矿、土木)领域,图表的核心使命是精准、客观地传递数据规律,而非追求视觉上的噱头。

在绝大多数的工程技术报告和学术论文中,有三种图表占据了 90% 以上的绝对统治地位:折线图散点图柱状图。掌握这“老三样”,并利用面向对象的方法将细节打磨到极致,就足以应对本科阶段几乎所有的计算可视化需求。

本节我们将以安全工程中的真实业务数据为例,逐一解析这三种图表的绘制要点。

提示:为保证代码的独立可运行性,本节的示例代码均包含了我们上一节总结的“跨平台学术字体模板”。在实际编写时,你可以将这套配置放在整个脚本的最上方统一执行。


折线图 (Line Plot):呈现演化规律#

适用场景:描述某个物理量随连续变量(最常见的是时间 $t$ 或空间距离、深度)的演化趋势。例如瓦斯涌出量的动态变化、巷道围岩变形量的时序监测等。

核心指令ax.plot(x, y, ...)

在折线图中,最常用的定制参数包括线型(linestylels)、线宽(linewidthlw)、颜色(colorc)以及数据点标记(marker)。

工程案例:掘进工作面双探头瓦斯浓度对比监测。

import matplotlib.pyplot as plt

# --- 学术与工程环境标准配置 ---
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"

# 1. 准备数据
time = [0, 2, 4, 6, 8, 10, 12] # 时间 (h)
sensor1 = [0.15, 0.22, 0.45, 0.60, 0.55, 0.40, 0.35] # 探头1瓦斯浓度 (%)
sensor2 = [0.12, 0.18, 0.38, 0.50, 0.45, 0.32, 0.28] # 探头2瓦斯浓度 (%)

fig, ax = plt.subplots(figsize=(7, 4))

# 2. 绘制多条折线并定制样式
# linestyle='-' 为实线,'--' 为虚线;marker='o' 为圆点,'^' 为上三角
ax.plot(time, sensor1, color='#d62728', linestyle='-', marker='o', linewidth=2, label="工作面探头 T1")
ax.plot(time, sensor2, color='#1f77b4', linestyle='--', marker='^', linewidth=2, label="回风流探头 T2")

# 3. 完善学术细节
ax.set_title(r"掘进工作面瓦斯浓度动态监测", pad=12)
ax.set_xlabel(r"监测时间 $t$ ($\mathrm{h}$)")
ax.set_ylabel(r"瓦斯浓度 $C$ ($\%$)")
ax.grid(True, linestyle=':', alpha=0.7)
ax.legend()

plt.show()

散点图 (Scatter Plot):探索离散相关性#

适用场景:展示大量离散实测数据点的分布状态,用于探索两个变量之间是否存在某种相关性(如线性相关、指数相关)。例如岩石力学测试中密度与弹性模量 $\mathring{E}$ 的关系,或煤层埋深与瓦斯含量的关系。

核心指令ax.scatter(x, y, ...)

与折线图不同,散点图默认不会将点用线段连接起来。它的强大之处在于可以通过参数映射数据点的大小(s,Size)颜色(c,Color),从而在二维平面上表达三维甚至更高维度的信息;同时使用透明度(alpha)来解决数据点密集重叠的问题。

工程案例:某矿区煤层埋深与实测瓦斯压力的相关性散点分布。

import matplotlib.pyplot as plt

# (此处省略字体配置,假定已在脚本顶端执行)

# 1. 准备实测离散数据
depth = [150, 220, 280, 350, 410, 480, 520, 580, 630, 700] # 煤层埋深 (m)
pressure = [0.5, 0.8, 1.2, 1.9, 2.3, 3.1, 3.5, 4.0, 4.8, 5.5] # 瓦斯压力 (MPa)

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

# 2. 绘制散点图
# s=60 控制散点面积大小;alpha=0.7 控制透明度(0完全透明, 1完全不透明);edgecolor 给散点加个边框显得更有质感
ax.scatter(depth, pressure, color='teal', s=60, alpha=0.7, edgecolor='black', label="实测钻孔数据")

ax.set_title(r"煤层埋深与瓦斯压力相关性分析")
ax.set_xlabel(r"煤层埋深 $H$ ($\mathrm{m}$)")
ax.set_ylabel(r"瓦斯压力 $P$ ($\mathrm{MPa}$)")
ax.grid(True, linestyle='--')
ax.legend()

plt.show()

(思考:观察这幅图输出后的形态,你能否用学过的数学知识猜出它符合哪种类型的函数方程?在后续的章节中,我们将学习如何用 Python 的 scipy 库对其进行曲线拟合。)


柱状图 (Bar Chart):离散分类对比#

适用场景:对非连续的、离散的类别(如不同的采区、不同的安全等级、不同的月份)进行数值大小的直观对比。

核心指令ax.bar(x, height, ...)

在柱状图中,横坐标 x 通常不再是一串连续的数字,而是一组字符串(代表类别名称)。常用参数包括柱体的宽度(width)和边缘颜色(edgecolor)。

工程案例:四个不同采煤工作面的安全评价综合得分对比。

import matplotlib.pyplot as plt

# (此处省略字体配置)

# 1. 准备分类数据
faces = ["101工作面", "102工作面", "103工作面", "201工作面"] # 分类标签
scores = [85, 92, 78, 88] # 安全评价得分

fig, ax = plt.subplots(figsize=(7, 4))

# 2. 绘制柱状图
# width=0.5 控制柱子宽度(取值0~1之间),edgecolor 设置柱子描边颜色
bars = ax.bar(faces, scores, width=0.5, color='steelblue', edgecolor='black')

ax.set_title(r"各采区本季度安全评价综合得分")
ax.set_ylabel(r"安全得分 ($S$)")

# 进阶技巧:强制设定 Y 轴下限和上限,使分数差异显示更合理
ax.set_ylim(60, 100) 

# 只保留水平网格线(axis='y'),使柱状图背景更清爽
ax.grid(axis='y', linestyle='--', alpha=0.7) 

plt.show()

小结:组合的力量#

这三种图表并不是孤立存在的。在实际的面向对象绘图时,我们完全可以在同一个坐标系(Axes)中叠加下达多个绘图指令

比如,在煤层埋深的散点图中,我们可以先用 ax.scatter() 画出离散的实测数据,然后再紧接着用 ax.plot() 画出一条理论推导的连续曲线。Matplotlib 会自动将它们完美地叠印在一张“图纸”上。这种像图层一样逐层叠加可视化元素的机制,赋予了工程师极大的创造自由。

画布与坐标轴对象图表元素与样式定制