第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.8 动手试试:用真实数据画一张图
光看不练可不行。我给你一个真实场景:
假设你手头有某监测站2024年1月的日平均温度数据(单位:℃):
| 日期 | 1日 | 2日 | 3日 | 4日 | 5日 | 6日 | 7日 |
|---|---|---|---|---|---|---|---|
| 温度 | 2.1 | 3.5 | 1.8 | 0.5 | -1.2 | 2.8 | 4.3 |
| 日期 | 8日 | 9日 | 10日 | 11日 | 12日 | 13日 | 14日 |
| 温度 | 5.0 | 3.2 | 1.5 | 0.8 | -0.3 | 2.0 | 3.8 |
试试用本章学到的知识,画出这14天的温度变化折线图。要求:
- X轴显示日期(1日、2日...14日)
- Y轴显示温度
- 添加标题「2024年1月上旬温度变化」
- 用红色标记最低温那天
提示:可以用 plt.axhline() 画一条0℃参考线,看看哪天低于冰点。
我的建议:先自己写代码,卡住了再看答案。编程这东西,看十遍不如写一遍。
好了,这一章就到这里。折线图虽然基础,但它是你进入时间序列分析世界的第一步。下一章咱们聊聊如何用折线图发现数据中的「异常值」——那才是真正有意思的地方。
公众号:蓝海资料掘金营,微信deep3321