2.3 训练场
2.3.1 绘制如下子图
要求:
- 设置中文字体并设置字体大小
- 分别计算每个城市年份、季度、月份、小时的PM2.5数据
- 会用到分组求平均值操作
- 进行数据重塑
- 根据需要调整行索引或者列索引
- 创建子视图2行2列
- 向子视图分别绘制年份、季度、月份、小时的各城市PM2.5走势数据
- 根据需要设置坐标轴标签(比如月份、小时)
首先我们需要下载一个 Excel 文件:
链接: https://pan.baidu.com/s/1nSw6wbOEg8GpP19WQ7ggxw?pwd=53ph
提取码: 53ph
下载完成之后,把该文件和我们的代码放到同一个文件夹下,这一操作我们在之前的博客中已经反复说到,这里就不再进行演示
注:代码处于运行中将显示:
下列代码运行几十秒甚至几分钟都是正常的,耐心等待运行结果即可。
我们先来加载我们的数据
%%time import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'KaiTi' plt.rcParams['font.size'] = 18 df = pd.read_excel('./PM2.5.xlsx')
接下来绘制年份的数据:
# 添加子视图 fig, axes = plt.subplots(2, 2, figsize = (16, 12)) # 按照城市年份分组,获取PM2.5,计算平均值并保留2位小数 df2 = df.groupby(by = ['城市', '年份'])[['PM2.5']].mean().round(2) # 数据重塑 df2 = df2.unstack(level = 0) # 城市作为列索引 df2.columns = df2.columns.droplevel(0) # 删除 PM2.5 这个列索引 df2 = df2[['北京', '上海', '广州', '沈阳', '成都']] # 调整列索引的顺序 df2.plot(ax = axes[0, 0]) # 左上角
绘制季度:
df3 = df.groupby(by = ['城市', '季节'])[['PM2.5']].mean().round(2) # 数据重塑 df3 = df3.unstack(level = 0) # 调整行索引顺序 df3 = df3.loc[list('春夏秋冬')] # 删除列索引 PM2.5 df3.columns = df3.columns.droplevel(0) # 调整列索引顺序 df3 = df3[['北京', '上海', '广州', '沈阳', '成都']] # 第一行第二列的子视图(右上角) df3.plot(ax = axes[0, 1])
绘制月份:
df4 = df.groupby(by = ['城市', '月份'])[['PM2.5']].mean().round(2) # 数据重塑 df4 = df4.unstack(level = 0) df4.columns = df4.columns.droplevel(0) df4 = df4[['北京', '上海', '广州', '沈阳', '成都']] ax = df4.plot(ax = axes[1, 0]) # 设置 months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] ax.set_xticks(np.arange(1, 13)) # 设置刻度(x轴) _ = ax.set_xticklabels(months, rotation = 60) # 旋转60°
绘制小时:
df5 = df.groupby(by = ['城市', '小时'])[['PM2.5']].mean().round(2) # 数据重塑 df5 = df5.unstack(level = 0) df5.columns = df5.columns.droplevel(0) df5 = df5[['北京', '上海', '广州', '沈阳', '成都']] ax = df5.plot(ax = axes[1, 1]) _ = ax.set_xticks(np.arange(0, 24))
最后我们来保存我们的图片:
plt.savefig('./homework7.png')