数据可视化实战(二)

将每个城市在每个月份平均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')
相关推荐
GFCGUO5 分钟前
ubuntu18.04运行OpenPCDet出现的问题
linux·python·学习·ubuntu·conda·pip
985小水博一枚呀2 小时前
【深度学习基础模型】神经图灵机(Neural Turing Machines, NTM)详细理解并附实现代码。
人工智能·python·rnn·深度学习·lstm·ntm
萧鼎3 小时前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python
IFTICing3 小时前
【文献阅读】Attention Bottlenecks for Multimodal Fusion
人工智能·pytorch·python·神经网络·学习·模态融合
大神薯条老师3 小时前
Python从入门到高手4.3节-掌握跳转控制语句
后端·爬虫·python·深度学习·机器学习·数据分析
程序员爱德华3 小时前
Python环境安装教程
python
huanxiangcoco3 小时前
152. 乘积最大子数组
python·leetcode
萧鼎4 小时前
Python常见问题解答:从基础到进阶
开发语言·python·ajax
PythonFun4 小时前
Python技巧:如何避免数据输入类型错误
前端·python
kaikai_sk4 小时前
搜索引擎相关的一段实习经历
python