第1章:数据可视化入门:用Matplotlib绘制环境指标随时间变化的折线图

各位同学好,我是老张。在环境数据分析这个行当里摸爬滚打了十几年,今天咱们来聊聊数据可视化这件事。

说实话,我刚入行那会儿,最头疼的不是算法有多复杂,而是——数据摆在那儿,领导让我「讲清楚趋势」。你想想看,一堆密密麻麻的数字,谁看得明白?后来我明白了,一张好图,胜过千言万语。

这一章,咱们就从最基础的折线图开始。别小看它,我敢说,你工作中80%的时间序列问题,一张折线图就能说清楚。

1.1 为什么折线图是环境数据分析的「第一张图」?

环境数据有个特点:它跟时间绑得特别紧。PM2.5浓度是早上高还是晚上高?河流COD值这个月比上个月涨了还是跌了?这些问题的答案,都藏在时间轴上。

折线图,说白了就是把数据点按时间顺序连起来。你一眼就能看出:

  • 趋势:整体是上升、下降,还是平稳?
  • 波动:有没有明显的周期性?比如每天、每周、每年的规律。
  • 异常:哪个时间点突然跳高或跳低?

我记得有一次做某湖泊的溶解氧监测,数据表里看着都正常。结果一画折线图,发现每年7月中旬都有一个「断崖式下跌」。后来排查发现,是那个时间段上游有农业排水。你看,光看表格根本发现不了。

核心观点:折线图不是「画着好看」,它是你发现数据秘密的第一把钥匙。

1.2 准备工作:安装和导入Matplotlib

咱们用Python,最常用的绘图库就是Matplotlib。它功能强大,而且免费。安装很简单:

pip install matplotlib

如果你用的是Anaconda,它通常已经装好了。不信你打开Jupyter Notebook试试:

import matplotlib.pyplot as plt
print("导入成功!")

嗯,这里要注意一点:很多人喜欢用 from matplotlib import pyplot as plt,我个人习惯直接用 import matplotlib.pyplot as plt,少打几个字,而且更清晰。

1.3 第一张折线图:从模拟数据开始

咱们先别急着拿真实数据,先造一组简单的模拟数据,把流程跑通。

import matplotlib.pyplot as plt

# 模拟一周的AQI(空气质量指数)数据
days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
aqi_values = [85, 92, 78, 105, 120, 95, 88]

# 绘制折线图
plt.plot(days, aqi_values)

# 添加标题和标签
plt.title('某城市一周AQI变化趋势')
plt.xlabel('日期')
plt.ylabel('AQI指数')

# 显示图形
plt.show()

跑一下这段代码,你会看到一张简单的折线图。虽然丑了点,但趋势已经出来了——周五的AQI最高,周三最低。

我在项目中遇到过类似的情况:有一次做某工业园区的空气质量分析,发现每周五下午PM2.5都会飙升。后来一查,是工厂在周五集中排放。你看,一张折线图就把问题暴露了。

1.4 让折线图「能看」:美化基础设置

默认的折线图太素了。咱们加点料:

plt.figure(figsize=(10, 6))  # 设置画布大小

plt.plot(days, aqi_values, 
         marker='o',          # 数据点用圆圈标记
         linestyle='-',       # 实线
         color='#2E86AB',     # 我喜欢的蓝色
         linewidth=2,         # 线宽
         markersize=8)        # 标记点大小

plt.title('某城市一周AQI变化趋势', fontsize=16, fontweight='bold')
plt.xlabel('日期', fontsize=12)
plt.ylabel('AQI指数', fontsize=12)
plt.grid(True, alpha=0.3)    # 添加网格线,透明度0.3

plt.show()

你看,加了网格线、改了颜色、标了数据点,是不是清晰多了?

小技巧:颜色别用默认的蓝色。我一般用 #2E86AB(深蓝)或者 #E67E22(橙色),在白色背景上更醒目。

1.5 多线对比:同时看多个环境指标

很多时候,我们需要把多个指标放在一张图里对比。比如PM2.5和PM10:

import matplotlib.pyplot as plt

days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
pm25 = [55, 62, 48, 75, 90, 65, 58]
pm10 = [80, 95, 70, 110, 130, 100, 85]

plt.figure(figsize=(10, 6))

plt.plot(days, pm25, marker='o', label='PM2.5', color='#2E86AB')
plt.plot(days, pm10, marker='s', label='PM10', color='#E67E22')

plt.title('PM2.5与PM10一周变化对比', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('浓度 (μg/m³)', fontsize=12)
plt.legend()  # 显示图例
plt.grid(True, alpha=0.3)

plt.show()

为什么要对比?因为PM2.5和PM10的比例能反映污染来源。PM2.5占比高,说明主要是燃烧源;PM10占比高,说明扬尘影响大。这些信息,一张图就全有了。

1.6 避坑指南:我踩过的三个坑

做折线图看着简单,但坑不少。我把自己踩过的坑分享给你:

  • 坑一:数据点顺序乱了。我曾经直接把Excel里的数据复制过来,没注意时间排序。结果折线图来回交叉,完全看不出趋势。记住:折线图的数据必须按时间顺序排列。
  • 坑二:刻度标签重叠。如果时间点太多(比如365天),所有标签挤在一起根本看不清。解决办法:用 plt.xticks(rotation=45) 旋转45度,或者只显示部分标签。
  • 坑三:Y轴不从0开始。有时候数据波动很小,Matplotlib会自动调整Y轴范围,导致波动看起来特别大。比如AQI从80到85,Y轴如果从70到90,看起来像暴涨。这时候要手动设置:plt.ylim(0, 150)

特别提醒:不要为了「好看」而过度美化。折线图的第一要义是「准确传达信息」。花里胡哨的配色、3D效果,往往适得其反。

1.7 本章知识体系

下面这张图,帮你梳理本章的核心逻辑:

折线图绘制核心流程 1. 数据准备 时间序列 + 指标值 2. 绘图设置 plt.plot() 参数配置 3. 美化修饰 标题/标签/网格/图例 4. 显示与保存 plt.show() / plt.savefig() 常见问题 数据乱序 / 标签重叠 / Y轴范围 进阶:多线对比 多个指标 / 图例区分 核心目标:准确传达时间序列中的趋势、波动与异常

1.8 动手试试:用真实数据画一张图

光看不练可不行。我给你一个真实场景:

假设你手头有某监测站2024年1月的日平均温度数据(单位:℃):

日期 1日2日3日4日5日6日7日
温度 2.13.51.80.5-1.22.84.3
日期 8日9日10日11日12日13日14日
温度 5.03.21.50.8-0.32.03.8

试试用本章学到的知识,画出这14天的温度变化折线图。要求:

  • X轴显示日期(1日、2日...14日)
  • Y轴显示温度
  • 添加标题「2024年1月上旬温度变化」
  • 用红色标记最低温那天

提示:可以用 plt.axhline() 画一条0℃参考线,看看哪天低于冰点。

我的建议:先自己写代码,卡住了再看答案。编程这东西,看十遍不如写一遍。

好了,这一章就到这里。折线图虽然基础,但它是你进入时间序列分析世界的第一步。下一章咱们聊聊如何用折线图发现数据中的「异常值」——那才是真正有意思的地方。


公众号:蓝海资料掘金营,微信deep3321