将每个城市在每个月份平均PM2.5绘制成折线图
python
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('./PM2.5.xlsx')
python
display(df.head(10))
df.shape # (161630, 15)
| | 城市 | 年份 | 月份 | 日期 | 小时 | 季节 | PM2.5 | 露点 | 湿度 | 压强 | 温度 | 风向 | 累计风速 | 降水量 | 累计降水量 |
| 0 | 北京 | 2010 | 1 | 1 | 23 | 冬 | 129 | -17.0 | 41.0 | 1020.0 | -5.0 | cv | 0.89 | 0.0 | 0.0 |
| 1 | 北京 | 2010 | 1 | 2 | 0 | 冬 | 148 | -16.0 | 38.0 | 1020.0 | -4.0 | SE | 1.79 | 0.0 | 0.0 |
| 2 | 北京 | 2010 | 1 | 2 | 1 | 冬 | 159 | -15.0 | 42.0 | 1020.0 | -4.0 | SE | 2.68 | 0.0 | 0.0 |
| 3 | 北京 | 2010 | 1 | 2 | 2 | 冬 | 181 | -11.0 | 63.5 | 1021.0 | -5.0 | SE | 3.57 | 0.0 | 0.0 |
| 4 | 北京 | 2010 | 1 | 2 | 3 | 冬 | 138 | -7.0 | 85.0 | 1022.0 | -5.0 | SE | 5.36 | 0.0 | 0.0 |
| 5 | 北京 | 2010 | 1 | 2 | 4 | 冬 | 109 | -7.0 | 85.0 | 1022.0 | -5.0 | SE | 6.25 | 0.0 | 0.0 |
| 6 | 北京 | 2010 | 1 | 2 | 5 | 冬 | 105 | -7.0 | 92.0 | 1022.0 | -6.0 | SE | 7.14 | 0.0 | 0.0 |
| 7 | 北京 | 2010 | 1 | 2 | 6 | 冬 | 124 | -7.0 | 92.0 | 1023.0 | -6.0 | SE | 8.93 | 0.0 | 0.0 |
| 8 | 北京 | 2010 | 1 | 2 | 7 | 冬 | 120 | -7.0 | 85.0 | 1024.0 | -5.0 | SE | 10.72 | 0.0 | 0.0 |
9 | 北京 | 2010 | 1 | 2 | 8 | 冬 | 132 | -8.0 | 85.0 | 1024.0 | -6.0 | SE | 12.51 | 0.0 | 0.0 |
---|
python
# 求PM2.5每个月份均值;根据城市和月份进行分组
df2 = df.groupby(by = ['城市','月份'])[['PM2.5']].mean().round(2)
# 数据重塑
df2 = df2.unstack(level = -1)
# 删除最外层列索引PM2.5
df2.columns = df2.columns.droplevel(level=0)
df2
| 月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 城市 | | | | | | | | | | | | |
| 上海 | 80.77 | 59.58 | 59.38 | 55.32 | 52.23 | 41.48 | 31.03 | 26.61 | 32.69 | 42.28 | 64.02 | 86.54 |
| 北京 | 113.80 | 120.93 | 96.34 | 83.40 | 76.67 | 89.56 | 88.48 | 73.75 | 78.75 | 112.72 | 108.47 | 107.49 |
| 广州 | 80.03 | 58.73 | 48.75 | 67.04 | 46.95 | 35.34 | 26.14 | 38.63 | 40.47 | 60.10 | 53.13 | 61.99 |
| 成都 | 161.32 | 110.04 | 96.71 | 67.99 | 68.56 | 53.81 | 54.05 | 61.26 | 60.25 | 84.76 | 82.13 | 116.08 |
沈阳 | 111.04 | 103.11 | 77.39 | 65.51 | 53.89 | 47.88 | 42.25 | 43.94 | 46.79 | 89.03 | 101.67 | 112.61 |
---|
python
df2.loc["上海"]
df2.index # Index(['上海', '北京', '广州', '成都', '沈阳'], dtype='object', name='城市')
python
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['font.size'] = 18
months = df2.columns
# 创建画布和子图
plt.figure(figsize=(12, 6))
# 绘制每个城市在每个月份的折线图
for city in df2.index:
# print(city, df2.loc[city])
plt.plot(months, df2.loc[city], marker='o', label=city)
# 设置标题和标签
plt.title('PM2.5 Variation by City and Month')
plt.xlabel('Month')
plt.ylabel('PM2.5')
plt.xticks(months)
plt.grid(True)
# 添加图例
plt.legend()
# 显示图形
plt.show()
将每个城市在每个季节最低温度绘制柱状图
python
df3 = df.groupby(by = ['城市','季节'])[['温度']].min().round(2)
df3 = df3.unstack(level=-1)
df3.columns = df3.columns.droplevel(level=0)
df3 = df3[list('春夏秋冬')]
df3 = df3.loc[['北京','上海','广州','成都','沈阳']]
df3
| 季节 | 春 | 夏 | 秋 | 冬 |
| 城市 | | | | |
| 北京 | -9.0 | 13.0 | -12.0 | -19.0 |
| 上海 | -1.0 | 17.0 | -2.0 | -4.0 |
| 广州 | 7.6 | 20.5 | 6.4 | 1.7 |
| 成都 | 5.0 | 18.0 | 5.0 | -2.0 |
沈阳 | -14.0 | 10.0 | -18.0 | -25.0 |
---|
python
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(1,1,1)
df3.plot.bar(ax = ax)
plt.grid(color = 'gray',ls = '--')
plt.ylabel('温度')
# 在中文字体下, 默认的负号, 会显示不正常
plt.rcParams['axes.unicode_minus'] = False
各个城市最大风速随时间变化趋势
python
import numpy as np
fig,axes = plt.subplots(2,2,figsize = (16,12)) # 添加子视图
df4 = df.groupby(by = ['城市','年份'])[['累计风速']].max().round(2)
# 数据重塑
df4 = df4.unstack(level = 0)
df4.columns = df4.columns.droplevel(0)
df4 = df4[['北京','上海','广州','沈阳','成都']]
# 在第一幅子图上绘制年份与风速
df4.plot(ax = axes[0,0])
axes[0, 0].set_ylabel("风速")
df5= df.groupby(by = ['城市','月份'])[['累计风速']].max().round(2)
# 数据重塑
df5 = df5.unstack(level = 0)
df5.columns = df5.columns.droplevel(0)
df5 = df5[['北京','上海','广州','沈阳','成都']]
ax = df5.plot(ax = axes[1,0]) # 子视图索引:第二行,第一列(左下角)
# 设置
months = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
ax.set_xticks(np.arange(1,13)) # 刻度
_ = ax.set_xticklabels(months,rotation = 60)
df6 = df.groupby(by = ['城市','季节'])[['累计风速']].max().round(2)
# 数据重塑
df6= df6.unstack(level = 0)
# 调整行索引顺序
df6 = df6.loc[list('春夏秋冬')]
# 删除列索引
df6.columns = df6.columns.droplevel(0)
# 调整列索引顺序
df6 = df6[['北京','上海','广州','沈阳','成都']]
# ax 指定了使用第一行,第二列的子视图:右上角
df6.plot(ax = axes[0,1])
df7 = df.groupby(by = ['城市','小时'])[['累计风速']].max().round(2)
# 数据重塑
df7= df7.unstack(level = 0)
df7.columns = df7.columns.droplevel(0)
df7 = df7[['北京','上海','广州','沈阳','成都']]
# 子视图索引1,1 == 第二行、第二列右下角
ax = df7.plot(ax = axes[1,1])
# 设置
_ = ax.set_xticks(np.arange(0,24))
# 保存
plt.savefig('./各个城市最大风速随时间变化趋势.png')