Python+Matplotlib实战:用气象数据绘制专业级污染玫瑰图(附完整数据集)

Python+Matplotlib实战:用气象数据绘制专业级污染玫瑰图(附完整数据集)

最近在分析一个城市的环境监测数据时,我遇到了一个典型问题:如何直观地展示不同风向、风速条件下污染物浓度的分布规律?传统的折线图或散点图在这里显得力不从心,它们无法同时清晰地表达风向(角度)、风速(半径)和污染物浓度(颜色)这三个维度的信息。这时,一种被称为“污染玫瑰图”的专业可视化工具进入了我的视野。它本质上是一种极坐标下的等高线填充图,能够将复杂的气象-污染关系以一幅直观、美观的图形呈现出来,是环境科学、气象分析和城市规划领域从业者进行数据解读和报告呈现的利器。

如果你也经常需要处理类似的风速、风向和污染物浓度数据,并且希望摆脱基础图表的束缚,制作出可以直接用于专业报告或学术论文的图表,那么本文将为你提供一套完整的、可直接复用的解决方案。我们将从真实数据集的读取与预处理开始,深入讲解风向弧度转换、数据网格化等核心技巧,并重点攻克极坐标轴设置、色标条定制以及图表整体美化等工业级难题。文末还会提供一个精心设计的Excel数据模板,帮助你快速上手,将这套方法应用到自己的实际项目中。

1. 环境准备与数据理解

在开始编码之前,确保你的工作环境已经就绪。我们将使用Python的核心科学计算和可视化库。如果你使用Anaconda,那么大部分库已经预装;如果使用原生Python,可以通过pip进行安装。

pip install numpy pandas matplotlib openpyxl

这里我们额外安装了openpyxl,是为了更好地支持新版Excel文件的读取。接下来,让我们先理解一下我们将要处理的数据结构。一份典型的气象-污染观测数据通常包含时间戳、风速、风向和一种或多种污染物浓度(如PM2.5、PM10、SO2等)。风向通常以角度(0-360度)表示,其中0度或360度代表正北,90度代表正东,以此类推。

注意:原始数据质量是可视化的基石。在绘图前,务必检查数据是否存在缺失值(NaN)、异常值(如风速为负、风向超出0-360度范围)或明显的记录错误。一个简单的数据质量检查流程可以避免后续分析得出误导性结论。

我们的目标是将这些离散的观测点,转化为一个在极坐标网格上连续的颜色分布图。这个过程可以分解为几个关键步骤:

  1. 数据加载与清洗:从文件(如Excel、CSV)中读取数据,并进行必要的清洗。
  2. 坐标转换与分箱:将风向从角度转换为弧度,并将风速和风向数据划分到预定义的网格区间中。
  3. 数据聚合:计算每个网格单元内污染物浓度的平均值(或其他统计量,如最大值、百分位数)。
  4. 网格数据生成:为绘图创建规则的风向-风速网格点矩阵。
  5. 图形绘制与美化:在极坐标轴上绘制填充等高线,并添加必要的图表元素(如色标条、方向标注、标题等)。

2. 数据处理:从原始观测到规则网格

假设我们已经获得了一份名为air_quality_meteo.xlsx的Excel数据文件,其中包含timestamp, wind_speed, wind_direction, PM2_5等字段。我们的第一项任务就是将其读入Pandas DataFrame并进行初步探查。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据,指定时间列为索引
file_path = './data/air_quality_meteo.xlsx'
df = pd.read_excel(file_path, index_col='timestamp')
print(df.head())
print(f"数据形状: {df.shape}")
print(df.describe())

加载数据后,我们首先处理风向。Matplotlib的极坐标系统使用弧度制,且默认0弧度指向正东(与数学极坐标一致),并以逆时针方向为正方向。然而,气象学惯例是0度指向正北,并以顺时针方向为正。为了符合惯例,我们需要进行转换。

# 将风向从角度转换为弧度
df['wind_direction_rad'] = np.radians(df['wind_direction'])

# 调整弧度方向:使0弧度对应正北,并改为顺时针方向为正。
# 首先,将“北风(0度)”转换为数学极坐标的“90度”(即π/2弧度)。
# 然后,为了变为顺时针,我们取负值。
df['wind_direction_rad'] = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值