版本说明
当前版本号[20230729]。
版本 | 修改说明 |
---|---|
20230729 | 初版 |
目录
文章目录
知识总览图
Python基础综合案例:数据可视化 - 折线图可视化
效果一:2020年印美日新冠累计确诊人数
2020年是新冠疫情爆发的一年, 随着疫情的爆发, 国内外确诊人数成了大家关心的热点, 相信大家都有看过类似的疫情报告. 本案例对印度美国日本三个国家确诊人数的进行了可视化处理, 形成了可视化的疫情确诊人数报告.
效果二:全国疫情地图可视化
效果三:动态GDP增长图
数据来源
本案例数据全部来自 <<百度疫情实时大数据报告>>,及公开的全球各国GDP数据
使用的技术
Echarts 是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是门富有表达力的语言,很适合用于数据处理. 当数据分析遇上数据可视化时pyecharts 诞生了.
json数据格式
什么是json
- JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据
- JSON本质上是一个带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互. 类似于:
- 国际通用语言-英语
- 中国56个民族不同地区的通用语言-普通话
json有什么用
各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型, 而其它语言可能没有对应的字典。
为了让不同的语言都能够相互通用的互相传递数据,JSON就是一种非常良好的中转数据格式。如下图,以Python和C语言互传数据为例:
json格式数据转化
json格式的数据要求很严格, 下面我们看一下他的要求
# json数据的格式可以是:
{"name":"admin","age":18}
# 也可以是:
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
Python数据和Json数据的相互转化
# 导入json模块
import json
# 准备符合格式json格式要求的python数据
data = [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
# 通过 json.dumps(data) 方法把python数据转化为了 json数据
json_data = json.dumps(data, ensure_ascii=False)
print(type(json_data))
print(f"python数据转化为了json数据的结果:{json_data}")
# 通过 json.loads(data) 方法把json数据转化为了 python数据
python_data = json.loads(json_data)
print(type(python_data))
print(f"json数据转化为了python数据的结果:{python_data}")
结果如下:(可见json和python里面对元素要求的格式也不一样,一个双引号一个单引号)
注:
通过 json.dumps(data) 方法把python数据转化为了 json数据
data = json.dumps(data)
如果有中文可以带上:ensure_ascii=False参数来确保中文正常转换
通过 json.loads(data) 方法把josn数据转化为了 python列表或字典
data = json.loads(data)
pyecharts模块介绍
如果想要做出数据可视化效果图, 可以借助pyecharts模块来完成
概况
Echarts 是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是门富有表达力的语言,很适合用于数据处理.
当数据分析遇上数据可视化时pyecharts 诞生了.
如何查看官方示例
打开官方画廊:
https://gallery.pyecharts.org/#/README
使用在前面学过的pip命令即可快速安装PyEcharts模块
pip install pyecharts
pyecharts快速入门
基础折线图
示例代码:
from pyecharts.charts import Line
line = Line()
line.add_xaxis(["炸鸡", "薯条", "汉堡"])
line.add_yaxis("价格", [45, 33, 23])
line.render()
生成图表:
pyecharts有哪些配置选项
lpyecharts模块中有很多的配置选项, 常用到2个类别的选项:
- 全局配置选项
- 系列配置选项
set_global_opts方法
这里全局配置选项可以通过set_global_opts方法来进行配置, 相应的选项和选项的功能如下:
全局配置项能做什么?
-
配置图表的标题
-
配置图例
-
配置鼠标移动效果
-
配置工具栏
-
等整体配置项
系列配置项,我们在后面构建案例时讲解
数据处理
原始数据格式:
导入模块:
再根据层级,一步步地去获取:
对数据进行整理, 让数据符合json格式:
import json
f_us = open("F:/美国.txt", "r", encoding="UTF-8")//打开文件
us_data = f_us.read()//全部读出来
# 把不符合json数据格式的 "jsonp_1629344292311_69436(" 去掉 ,再赋值回us_data
us_data = us_data.replace("jsonp_1629344292311_69436(", "")
# 把不符合json数据格式的 ");" 去掉,从后往前数去掉最后两个字节
us_data = us_data[:-2]
# 数据格式符合json格式后,对数据进行转化成字典
us_dict = json.loads(us_data)
# 获取美国的疫情数据
trend_data = us_dict['data'][0]['trend']
# x1_data存放2020年日期数据
x_data = trend_data['updateDate'][:314]
# y1_data存放2020年人数数据
y_data = trend_data['list'][0]['data'][:314]
print(x_data)
print(y_data)
创建折线图
导入模块
折线图相关配置项
创建折线图
- 这里的Line()是构建类对象,我们先不必理解是什么意思,后续在Python高阶中进行详细讲解。
- 目前我们简单的会用即可
添加数据
.add_yaxis相关配置选项
set_global_opts全局配置选项
.set_global_opts(
# 设置图标题和位置
title_opts=opts.TitleOpts(title="2020年 印🇮🇳美🇺🇸日🇯🇵 累计确诊人数对比图",pos_left="center"),
# x轴配置项
xaxis_opts=opts.AxisOpts(name=“时间”), # 轴标题
# y轴配置项
yaxis_opts=opts.AxisOpts(name=“累计确诊人数”), # 轴标题
# 图例配置项
legend_opts=opts.LegendOpts(pos_left=‘70%‘), # 图例的位置
)
示例代码:
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LabelOpts, LegendOpts, ToolboxOpts, AxisPointerOpts
f_us = open("F:/美国.txt", "r", encoding="UTF-8")
f_jp = open("F:/日本.txt", "r", encoding="UTF-8")
f_in = open("F:/印度.txt", "r", encoding="UTF-8")
us_data = f_us.read()
jp_data = f_jp.read()
in_data = f_in.read()
us_data = us_data.replace("jsonp_1629344292311_69436(", "")
jp_data = jp_data.replace("jsonp_1629350871167_29498(", "")
in_data = in_data.replace("jsonp_1629350745930_63180(", "")
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
trendus_data = us_dict['data'][0]['trend']
trendjp_data = jp_dict['data'][0]['trend']
trendin_data = in_dict['data'][0]['trend']
us_x_data = trendus_data['updateDate'][:314]
jp_x_data = trendjp_data['updateDate'][:314]
in_x_data = trendin_data['updateDate'][:314]
us_y_data = trendus_data['list'][0]['data'][:314]
jp_y_data = trendjp_data['list'][0]['data'][:314]
in_y_data = trendin_data['list'][0]['data'][:314]
epidemic_line = Line() //构建折线图对象
epidemic_line.add_xaxis(us_x_data) //x轴上的数据是共用的,所以使用一个国家的数据即可
epidemic_line.add_yaxis("美国确诊人数", us_y_data, label_opts=LabelOpts(is_show=False))
epidemic_line.add_yaxis("日本确诊人数", jp_y_data, label_opts=LabelOpts(is_show=False))
epidemic_line.add_yaxis("印度确诊人数", in_y_data, label_opts=LabelOpts(is_show=False))
//label_opts=LabelOpts(is_show=False) 是指不显示标签上的数字,看起来就不会那么杂
epidemic_line.set_global_opts(
title_opts=TitleOpts(title="2020年美日印确诊人数对比折线图", pos_left="center", pos_bottom="1%"),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
axispointer_opts=AxisPointerOpts()
)
#调用方法,生成图表
epidemic_line.render()
#关闭文件对象
f_us.close()
f_jp.close()
f_in.close()
折现图以下: