课程学习来源:b站up:【蚂蚁学python】
【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】
【课程资料链接:【链接】】
Python绘制饼图分析北京天气
饼图,是一个划分为几个扇形的圆形统计图表,能够直接以图形的方式直接显示各个组成部分所占比例
目的:查看2019年北京天气数据,使用饼图查看天气、风向、空气质量的数据对比
1.编写函数,创建一个pyecharts饼图对象
from pyecharts import options as opts
from pyecharts.charts import Pie
def create_pie(datas, title) -> Pie:
"""
创建饼图对象
@param datas:数据,形式为[('晴',115), ('多云',78), ('晴转多云',39)]
@param title:图表的标题
"""
pie = Pie()
pie.add("", datas)
pie.set_global_opts( # 设置全局参数
title_opts = opts.TitleOpts(title = title), # 图标标题
legend_opts = opts.LegendOpts(pos_right = "right")# 图标标签放在右侧
)
pie.set_series_opts(label_opts = opts.LabelOpts(formatter = "{b}: {c}: {d}%"))
# b:名称
# c:数量
# d:百分比
return pie
2.读取北京2019天气数据
import pandas as pd
df = pd.read_csv("../DATA_POOL/PY_DATA/ant-learn-visualization-master/datas/beijing_tianqi/beijing_tianqi_2019.csv")
df.head(5)
ymd | bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019-01-01 | 1℃ | -10℃ | 晴~多云 | 西北风 | 1级 | 56 | 良 | 2 |
1 | 2019-01-02 | 1℃ | -9℃ | 多云 | 东北风 | 1级 | 60 | 良 | 2 |
2 | 2019-01-03 | 2℃ | -7℃ | 霾 | 东北风 | 1级 | 165 | 中度污染 | 4 |
3 | 2019-01-04 | 2℃ | -7℃ | 晴 | 西北风 | 2级 | 50 | 优 | 1 |
4 | 2019-01-05 | 0℃ | -8℃ | 多云 | 东北风 | 2级 | 29 | 优 | 1 |
3.绘制饼图查看天气类型对比
df_tianqi = df.groupby("tianqi").size().sort_values(ascending = False)
# Flase表示递增为false,即选择递减
# 按照天气进行分组
df_tianqi # series
tianqi
晴 115
多云 78
晴~多云 39
多云~晴 34
小雨~多云 11
多云~雷阵雨 10
霾 8
多云~小雨 7
雷阵雨~多云 7
雷阵雨 7
阴~多云 5
多云~阴 4
小雨 4
雷阵雨~中雨 4
小雪~多云 4
阴~小雨 3
雷阵雨~晴 2
雷阵雨~小雨 2
霾~多云 2
中雨~多云 2
阴 2
中雨~小雨 2
多云~中雨 2
中雨~雷阵雨 2
阴~中雨 1
晴~霾 1
小雪 1
小雨~阴 1
小雨~晴 1
多云~中雪 1
雾~晴 1
霾~晴 1
霾~雾 1
dtype: int64
datas = list(zip(df_tianqi.index.to_list(), df_tianqi.to_list()))
# zip可以拼接两个list,形成一个二元组list
datas
[('晴', 115),
('多云', 78),
('晴~多云', 39),
('多云~晴', 34),
('小雨~多云', 11),
('多云~雷阵雨', 10),
('霾', 8),
('多云~小雨', 7),
('雷阵雨~多云', 7),
('雷阵雨', 7),
('阴~多云', 5),
('多云~阴', 4),
('小雨', 4),
('雷阵雨~中雨', 4),
('小雪~多云', 4),
('阴~小雨', 3),
('雷阵雨~晴', 2),
('雷阵雨~小雨', 2),
('霾~多云', 2),
('中雨~多云', 2),
('阴', 2),
('中雨~小雨', 2),
('多云~中雨', 2),
('中雨~雷阵雨', 2),
('阴~中雨', 1),
('晴~霾', 1),
('小雪', 1),
('小雨~阴', 1),
('小雨~晴', 1),
('多云~中雪', 1),
('雾~晴', 1),
('霾~晴', 1),
('霾~雾', 1)]
pie = create_pie(datas, "饼图=-天气对比")
from IPython.display import HTML
# 同上,读取 HTML 文件内容
# bar.render()的值是一个路径,以字符串形式表示
with open(pie.render(), 'r', encoding='utf-8') as file:
html_content = file.read()
# 直接在 JupyterLab 中渲染 HTML
HTML(html_content)
4.绘制饼图查看风向数据比例对比
df.head()
ymd | bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019-01-01 | 1℃ | -10℃ | 晴~多云 | 西北风 | 1级 | 56 | 良 | 2 |
1 | 2019-01-02 | 1℃ | -9℃ | 多云 | 东北风 | 1级 | 60 | 良 | 2 |
2 | 2019-01-03 | 2℃ | -7℃ | 霾 | 东北风 | 1级 | 165 | 中度污染 | 4 |
3 | 2019-01-04 | 2℃ | -7℃ | 晴 | 西北风 | 2级 | 50 | 优 | 1 |
4 | 2019-01-05 | 0℃ | -8℃ | 多云 | 东北风 | 2级 | 29 | 优 | 1 |
df_fengxiang = df.groupby("fengxiang").size().sort_values(ascending = False)
datas = list(zip(df_fengxiang.index.to_list(), df_fengxiang.to_list()))
pie = create_pie(datas, "饼图-风向")
from IPython.display import HTML
# 同上,读取 HTML 文件内容
# bar.render()的值是一个路径,以字符串形式表示
with open(pie.render(), 'r', encoding='utf-8') as file:
html_content = file.read()
# 直接在 JupyterLab 中渲染 HTML
HTML(html_content)
5.绘制饼图查看空气质量对比
df.head()
ymd | bWendu | yWendu | tianqi | fengxiang | fengli | aqi | aqiInfo | aqiLevel | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019-01-01 | 1℃ | -10℃ | 晴~多云 | 西北风 | 1级 | 56 | 良 | 2 |
1 | 2019-01-02 | 1℃ | -9℃ | 多云 | 东北风 | 1级 | 60 | 良 | 2 |
2 | 2019-01-03 | 2℃ | -7℃ | 霾 | 东北风 | 1级 | 165 | 中度污染 | 4 |
3 | 2019-01-04 | 2℃ | -7℃ | 晴 | 西北风 | 2级 | 50 | 优 | 1 |
4 | 2019-01-05 | 0℃ | -8℃ | 多云 | 东北风 | 2级 | 29 | 优 | 1 |
df_aqiInfo = df.groupby("aqiInfo").size().sort_values(ascending=False)
datas = list(zip(df_aqiInfo.index.to_list(), df_aqiInfo.to_list()))
pie = create_pie(datas, "饼图-空气质量")
from IPython.display import HTML
# 同上,读取 HTML 文件内容
# bar.render()的值是一个路径,以字符串形式表示
with open(pie.render(), 'r', encoding='utf-8') as file:
html_content = file.read()
# 直接在 JupyterLab 中渲染 HTML
HTML(html_content)