数据可视化实战(二)

将每个城市在每个月份平均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')
相关推荐
数模竞赛Paid answer6 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
leisoo80977 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20227 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
金銀銅鐵9 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
OH_TPC10 小时前
【鸿蒙优选三方库】@ohos/mpchart:让 HarmonyOS 应用的数据可视化开箱即用
华为·信息可视化·harmonyos·鸿蒙
Python大数据分析@11 小时前
使用大模型MCP采集数据,爬虫已经无门槛
python·网络爬虫
quantdash_cc11 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
65岁退休Coder12 小时前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境12 小时前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python
半亩码田12 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#