数据可视化实战(二)

将每个城市在每个月份平均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')
相关推荐
凤枭香15 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺23 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森27 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁3 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev3 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理