目标:开发三份可视化图表:折线图、地图、动态柱状图
数据来源:
-
本案例数据全部来自《百度疫情实时大数据报告》及公开的全球各国的GDP数据
使用的技术:
Echarts--百度开源的数据可视化。Python适合用于数据处理。 pyecharts
前置知识准备:
json数据格式
-
json是一种轻量级的数据交互模式。可以按照json指定的格式去组织和封装数据
-
json本质上是一个带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中数据传递和交互,类似于:
· 国际通用语言--英语
· 中国56个民族不同地区之间的通用语言--普通话
json能够让不同的语言能够相互通用互相传递数据,json就是一种非常良好的中转数据格式。以Python和C语言为例:
json格式可以看作Python中的字典/内嵌字典的列表
· Python数据和json数据的相互转化
"""
演示json数据和Python字典的相互转换
"""
import json
# 准备列表,内嵌元素为字典,将其转换为json
data = [{"name":'朱翠花1号',"age":21}, {"name":'朱翠花2号',"age":22}, {"name":'朱翠花3号',"age":23}]
json_str = json.dumps(data,ensure_ascii=False)
print(json_str,type(json_str))
# 准备字典,将字典转换为json
d = {"name":'朱翠花大坏蛋',"gender":'男'}
json_d = json.dumps(d,ensure_ascii=False)
print(json_d,type(json_d))
# 将json字符串转换为Python数据类型[{k:v,k:v},{k:v,k:v}]
s = '[{"name":"朱翠花1号","age":21}, {"name":"朱翠花2号","age":22}, {"name":"朱翠花3号","age":23}]'
list_j = json.loads(s)
print(type(list_j))
print(list_j)
# 将json字符串转换为Python数据类型{k:v,k:v}
str = '{"name":"朱翠花大坏蛋","gender":"男"}'
dj = json.loads(str)
print(type(dj))
print(dj)
pyecharts模块 --开发可视化图表的技术栈
如果想要做出数据可视化效果图,可以借助pyecharts模块完成。
Echarts是一个有百度开源的数据可视化,有着良好的交互性,精巧的图表设计。
pyecharts - A Python Echarts Plotting Library built with love.
pyecharts模块-入门操作
1、基础折线图
2、pyecharts的配置选项
-
全局配置选项:针对整个图像进行设置,图像标题、图例、工具箱等
set_global_opts方法来进行配置:
set_global_opts方法配置选项:
-
系列配置选项:针对具体的轴数据进行配置
"""
演示pyecharts入门
"""
# 导包
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts
# 创建一个折线图对象
line = Line()
# 给折线图对象添加X轴数据
line.add_xaxis(["中国","美国","英国"])
# 给折线图对象添加Y轴数据
line.add_yaxis("GDP",[30,20,10])
# 设置全局变量 set_global_opts pos-position
line.set_global_opts(
title_opts=TitleOpts("国际GDP展示",pos_left="center",pos_bottom="1%"),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
visualmap_opts=VisualMapOpts(is_show=True)
)
# 通过render方法,将代码生成为图像
line.render()
3、数据处理
懒人工具-json在线解析-在线JSON格式化工具-json校验-程序员必备 在线懒人工具 --json数据格式处理
4、案例实现
案例实现--折线图 2020年印美日新冠累计确诊人数
"""
演示可视化需求1:折线图开发
"""
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LabelOpts
# 处理数据
f_us = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\美国.txt",'r',encoding='UTF-8')
us_data = f_us.read()
f_jp = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\日本.txt",'r',encoding='UTF-8')
jp_data = f_jp.read()
f_in = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\折线图数据\印度.txt",'r',encoding='UTF-8')
in_data = f_in.read()
# 去掉不合json规范的开头
us_data = us_data.replace('jsonp_1629344292311_69436(','')
jp_data = jp_data.replace('jsonp_1629350871167_29498(','')
in_data = in_data.replace('jsonp_1629350745930_63180(','')
# 去掉不合json规范的结尾 序列切片 切到倒数第二个 尾巴不包含所以取到-2
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
# json转Python字典
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
# 获取trend key
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']
# 获取日期数据,用于X轴 取2020年到314下标结束
us_x_data = us_trend_data['updateDate'][:314]
jp_x_data = jp_trend_data['updateDate'][:314]
in_x_data = in_trend_data['updateDate'][:314]
# 获取确认数据,用于Y轴 取2020年到314下标结束
us_y_data = us_trend_data['list'][0]['data'][:314]
jp_y_data = jp_trend_data['list'][0]['data'][:314]
in_y_data = in_trend_data['list'][0]['data'][:314]
# 制作图表
line = Line() # 构建折线图对象
# 添加X轴数据 X轴公用使用一个国家的数据即可
line.add_xaxis(us_x_data)
# 添加Y轴数据 Y不公用
line.add_yaxis("美国确诊人数",us_y_data,label_opts=LabelOpts(is_show=False))
line.add_yaxis("日本确诊人数",jp_y_data,label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度确诊人数",in_y_data,label_opts=LabelOpts(is_show=False))
# 设置全局变量
line.set_global_opts(
# 标题设置
title_opts=TitleOpts(title='2020年美日印三国确诊人数对比折线图',pos_left='center',pos_bottom="1%")
)
# 生成图表
line.render()
# 关闭文件
f_us.close()
f_jp.close()
f_in.close()
地图的基础应用:
案例实现--地图1: 全国疫情地图--各省份确诊人数
"""
演示全国疫情可视化地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取数据文件
f = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\地图数据\疫情.txt",'r',encoding='UTF-8')
data = f.read()
f.close()
# 取全国各地的数据
# 将json字符串转化为python字典
data_dict = json.loads(data)
# 从字典中取出省份数据
province_data_list = data_dict["areaTree"][0]["children"]
# 组装每个省份和确诊人数为元组 并将各个省的数据都封装到列表内
data_list = []
for province_data in province_data_list:
province_name = province_data["name"] # 省份名称
province_confirm = province_data["total"]["confirm"] # 确诊人数
data_list.append((province_name,province_confirm))
print(data_list)
# 添加地图
map = Map()
map.add("各省份确诊人数",data_list,"china")
# 设置全局变量,定制分段的视觉映射
map.set_global_opts(
title_opts=TitleOpts(title="全国疫情地图"),
visualmap_opts=VisualMapOpts(
is_show=True, # 是否显示
is_piecewise=True, # 是否分段
pieces=[
{"min": 1, "max": 99, "label": "1-99人", "color": "#EEEED1"},
{"min": 100, "max": 999, "label": "100-999人", "color": "#FFC1C1"},
{"min": 1000, "max": 4999, "label": "1000-4999人", "color": "#FF6A6A"},
{"min": 5000, "max": 9999, "label": "5000-9999人", "color": "#FFD700"},
{"min": 10000, "max": 99999, "label": "10000-99999", "color": "#FF6347"},
{"min": 100000, "label": "100000+", "color": "#DC143C"}
]
)
)
map.render()
案例实现--地图2: 河南省疫情地图绘制
"""
演示河南省的疫情地图
"""
import json
from pyecharts.charts import *
from pyecharts.options import *
# 读取数据文件
f = open("E:\BaiduNetdiskDownload\Python课件\资料\可视化案例数据\地图数据\疫情.txt",'r',encoding='UTF-8')
data =f.read()
# 关闭文件
f.close()
# 将json数据---python字典
data_dict = json.loads(data)
# 取河南省的数据
data_list = data_dict["areaTree"][0]["children"][3]["children"]
# 取河南省各个市的数据
res_list = []
for data in data_list:
name = data["name"]+"市"
num = data["total"]["confirm"]
res_list.append((name,num))
print(res_list)
# 单独添加济源市数据
res_list.append(('济源市',5))
# 添加地图
map = Map()
# 在地图中添加数据
map.add("河南确诊人数",res_list,"河南")
# 设置地图全局配置
map.set_global_opts(
title_opts=TitleOpts(title="河南疫情地图"),
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=(
{"min":1,"max":9,"label":"1-9","color":"#EEEED1"},
{"min":10,"max":99,"label":"10-99","color":"#FFC1C1"},
{"min":100,"max":999,"label":"100-999","color":"#FF6A6A"},
{"min":1000,"max":9999,"label":"1000-9999","color":"#FF0000"}
)
)
)
map.render()
动态柱状图-- 基础时间线柱状图
-
通过Bar构建基础柱状图 --柱状图添加x,y数据 传入的为list对象
-
反转X和Y轴
-
数值标签设在右侧
-
创建时间线
-
设置自动播放
-
时间线设置主题
"""
带有时间线的柱状图开发
"""
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
bar1 =Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GDP",[30,20,10],label_opts=LabelOpts(position="right"))
bar1.reversal_axis()
bar2 =Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",[50,30,20],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()
bar3 =Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",[60,60,30],label_opts=LabelOpts(position="right"))
bar3.reversal_axis()
# 构建时间线对象-- 同时设置主题
timeline = Timeline({"theme":ThemeType.LIGHT})
# 在时间线内添加柱状图对象
timeline.add(bar1,"点1")
timeline.add(bar2,"点2")
timeline.add(bar3,"点3")
# 自动播放设置
timeline.add_schema(
play_interval=1000, # 自动播放的时间间隔 单位毫秒
is_timeline_show=True, # 是否在自动播放的时候显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
# 主题设置
# 绘图-使用时间线对象绘制,而不是bar对象
timeline.render("基础时间线柱状图.html")
动态柱状图-- GDP动态柱状图
-
列表的sort方法 :
在前面我们学习过sorted函数,可以对数据容器进行排序。在后面的数据处理中,我们需要对列表进行排序,并指定排序规则,sorted函数就无法完成了。 我们补充学习列表的sort方法。
使用方式: 列表.sort(key=选择排序依据的函数, reverse=True|False)
· 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
· 参数reverse,是否反转排序结果,True表示降序,False表示升序
"""
拓展列表的sort方法
在学习了将函数作为参数传递后,我们可以学习列表的sort方法来对列表进行自定义排序
"""
# 准备列表
my_list = [['a',22],['b',33],['c',44],['d',11]]
# 排序-基于带名函数
# def choose_sort_key(element):
# return element[1]
# my_list.sort(key=choose_sort_key,reverse=False)
# print(my_list)
# 排序 -基于lambda匿名函数
my_list.sort(key=lambda element:element[1],reverse=False)
print(my_list)
-
需求分析:
1. GDP数据处理为亿级
2. 有时间轴,按照年份为时间轴的点
3. x轴和y轴反转,同时每一年的数据只要前8名国家
4. 有标题,标题的年份会动态更改
5. 设置了主题为LIGHT
-
数据处理:
将数据转换为字典存储,格式为:{ 年份: [ [国家, gdp], [国家,gdp], ...... ], 年份: [ [国 家, gdp], [国家,gdp], ...... ], ......
代码实现:
"""
演示第三个图表,GDP动态柱状图开发
"""
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *
from pyecharts.globals import *
# 读取数据
f = open("E:/1960-2019全球GDP数据.csv",'r',encoding='GB2312')
data_lines = f.readlines()
# 关闭文件
f.close()
# 删除不必要数据 --第一条
data_lines.pop(0)
# 将数据转化为字典格式
完整代码在zip包中