Python绘制污染玫瑰图

整体的思路是使用contourf函数实现污染玫瑰图,具体步骤如下:

  • 读取数据
  • 处理数据
  • 数据网格化
  • 绘制污染玫瑰图

最终效果如下:
在这里插入图片描述

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

获取数据

这里我使用的是完整的数据,其中没有nan(缺失值)。我建议在绘图之前如果有缺失或异常数据需要认真处理。这里我们主要展示绘图部分
数据获取地址

file = r'../data/20年2月污染气象参数.xls'
data = pd.read_excel(file, usecols=['时间', '风速(m/s)', '风向(deg)', 'PM2.5'], index_col=0).iloc[:115, :]
data
风向(deg)风速(m/s)PM2.5
时间
2020-02-01 00:00229.91.3106
2020-02-01 01:00239.31.1110
2020-02-01 02:00243.20.798
2020-02-01 03:00292.70.477
2020-02-01 04:00288.20.585
............
2020-02-05 14:0075.94.39
2020-02-05 15:0073.34.312
2020-02-05 16:0079.14.51
2020-02-05 17:0074.24.48
2020-02-05 18:0077.74.34

115 rows × 3 columns

处理数据

  1. 将风向数据转化为弧度数据
data['风向(deg)'] = np.radians(data['风向(deg)'])
  1. 处理风速风向分类的单位
v = data['风速(m/s)']
# 风速按16等分分类
speed = np.linspace(v.min(), v.max(), endpoint=True, num=16)
# 风向按32等分分类
deg = np.linspace(0, 2*np.pi, endpoint=True, num=32)

生成网格数据

def maker(s, sequence):
    '''
    将划分网格内的数据按较小值划分
    '''
    for i, val in enumerate(sequence):
        if s <= sequence[i+1]:
            return val
d = data['风向(deg)']
data['风速(m/s)'] = v.apply(maker, sequence=speed)
data['风向(deg)'] = d.apply(maker, sequence=deg)
data.head()
风向(deg)风速(m/s)PM2.5
时间
2020-02-01 00:003.8509851.14106
2020-02-01 01:004.0536680.86110
2020-02-01 02:004.0536680.5898
2020-02-01 03:005.0670850.3077
2020-02-01 04:004.8644020.3085
  • 使用mean方法对PM2.5数据进行栅格化分类
# 由于整体PM2.5数据有标记,所以需要将2.5数据处理成float类型
data['PM2.5'] = data['PM2.5'].astype(float)
dt = data.pivot_table(values='PM2.5', index='风速(m/s)', columns='风向(deg)', aggfunc=np.mean)
# 补齐网格并对于缺失的网格用0值填充,这样绘图的效果好一些
dt.fillna(0, inplace=True)
dt = dt.reindex(index=speed, columns=deg, fill_value=0)
dt.head(6)
风向(deg)0.0000000.2026830.4053670.6080500.8107341.0134171.2161001.4187841.6214671.824151...4.4590354.6617184.8644025.0670855.2697685.4724525.6751355.8778196.0805026.283185
风速(m/s)
0.3062.061.078.00.00.00.00.00.00.00.0...0.00.085.077.00.00.00.00.00.00.0
0.5882.00.00.00.00.00.00.00.00.065.0...0.00.00.00.00.00.00.00.093.50.0
0.8665.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
1.140.089.00.00.00.00.00.066.030.00.0...0.00.00.00.00.00.00.00.00.00.0
1.420.00.00.00.037.00.00.00.091.524.0...0.00.00.00.00.00.00.00.00.00.0
1.7067.0114.00.078.00.036.021.00.032.00.0...0.00.00.00.00.00.00.00.00.00.0

6 rows × 32 columns

绘制污染玫瑰图

  1. meshgrid()将网格数据生成绘制数据
theta, r = np.meshgrid(deg, speed)
  1. 使用contourf()绘制污染玫瑰图
ax = plt.subplot(projection='polar')
ax.set_theta_zero_location("N")
ax.set_theta_direction('clockwise')
pos = ax.contourf(theta, r, dt.to_numpy(), cmap='jet')
plt.colorbar(pos, ax=ax)
plt.show()

在这里插入图片描述

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值