数据可视化(pyecharts)
JSON数据格式
知道什么是JSON
JSON是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据,本质上是一个带有特定格式的字符串
主要功能 :JSON负责不同编程语言中的数据传递和交互
JSON格式数据转化
JSON数据的格式可以是:
{"name":"admin","age":18}
#或
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
python数据和json数据的相互转化
#导入json模块
import json
#准备符合格式json格式要求的py数据
data = [{"name":"老王","age":16},{"name":"张三","age" :20}]
#通过json.dumps(data)方法把python数据转化为了json数据
data = json.dumps(data)
#通过json.loads(data)方法把json数据转化为了py数据
data = json.loads(data)
pyecharts模块介绍
如果想要做出数据可视化效果图,可以借助pyecharts模块来完成
概况:Echarts是个由百度开源数据可视化,凭借着良好的交互性,精巧的图标设计,的刀客众多开发者的认可,而python是门富有表达力的语言,很适合用于数据处理,当数据分析遇上数据可视化时pyecharts诞生了
pyechats操作
pyecharts入门
基础折线图
#导包,导入Line功能构建折线图对象
from pyechats.charts import Line
#得到折线图对象
line = Line()
#添加x轴数据
line.add_xaxis(["中国","美国","英国"])
#添加y轴数据
line.aaa_yaxis("GDP",[30,20,10]) #数据分别对应x轴 例如:中国➡️30
#生成图表
line.render()
pyecharts配置选项
pyecharts中有很多配置选项,常用的有两类
全局配置选项
针对整个图像进行设置 例如:图像的标题,图像的图例,工具箱
系列配置选项
针对具体的轴数据进行配置
set_global_opts方法
这里全局配置选项可以通过set_global_opts方法来进行配置
#导可配置选项包
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts #标题,图例,工具箱,视觉映射控制选项
#设置全局配置项
#title.opts指设置标题
#pos指位置 left指靠近左边有多远 bottom指距离底部有多远 center指居中
#lengend_opts指设置图例
#is_show指是否展示
#toolbox_opts指设置工具箱
line.set_global_opts(
title_opts = TitleOpts(title = "GDP展示",pos_left = "center",pos_bottom = "1%"),
lengend_opts = LegendOpts(is_show = True),
toolbox_opts = ToolboxOpts(is_show = True),
visualmap_opts = VisualMapOpts(is_show = True)
)
详细配置项可查看
折线图开发
数据处理
可先通过第三方网站对数据进行梳理
import json
#处理数据
f_us = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\美国.txt","r",encoding = "UTF-8")
us_data = f_us.read()
#去掉不合json规范的开头
us_data = us_data.replace("jsonp_1629344292311_69436(","") #替换为空白
#去掉不合json规范的结尾
#采用序列切片的方式去除后两个符号
us_data = us_data[:-2]
#json转python字典
us_dict = json.loads(us_data)
#获取trend key
us_trend_data = us_dict["data"][0"["trend"]
#获取日期数据用于x轴,取2020年(到314下标结束)
us_x_data = us_trend_data["updateDate"][:314]
#获取确认数据用于y轴,取2020年 (确诊人数)
us_y_data = us_trend_data["list"][0]["data"][:314]
创建折线图
引入pyecharts包并完成剩余两个国家数据处理
再进行全局配置选项设置
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LabelOpts
#处理数据
f_us = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\美国.txt","r",encoding = "UTF-8")
us_data = f_us.read()
f_jp = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\日本.txt","r",encoding = "UTF-8")
jp_data = f_jp.read()
f_in = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\折线图数据\印度.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规范的结尾
#采用序列切片的方式去除后两个符号
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年 (确诊人数)
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轴数据 还可以进行系列配置 label指的是图例中数字设置
line.add_yaxis("美国确诊人数",us_y_data, label_opts = LabelOpts(is_show = False)) #添加美国的y轴数据
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 = TitleOtps(title = "2020年美日印三国确诊人数对比折线图",pos_left = "center",pos_bottom = "1%")
)
#调用render方法生成图表
line.render()
#关闭文件
f_us.close()
f_jp.close()
f_in.close()
效果图:
地图可视化
基础地图演示
#准备地图对象
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map = Map()
#准备数据 列表里嵌套元组
data = [
("北京市",99),
("上海市",199),
("湖南省",299),
("台湾省",399),
("广东省",499),
]
#添加数据 名称 数据 地图类型
map.add("测试地图",data,"china")
#设置全局选项
map.set_global_opts(
#可视化地图设置
visualmap_opts = VisualMapOpts(
is_show = True,
#开启手动校准范围
is_piecewise = True,
#具体范围 列表中每个元素为字典
piece = [
{"min" : 1 ,"max" : 9,"label":"1-9","color" :"#CCFFFF"},
{"min" : 10 ,"max" : 99,"label":"10-99","color" :"#FF6666"},
{"min" : 100 ,"max" : 500,"label":"100-500","color" :"#990033"}
]
)
)
#绘图
map.render()
效果图:
疫情地图-国内疫情地图
import json
from pyecharts.charts import Map
from pyecharts.optinons import *
#读取数据文件
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\地图数据\疫情.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))
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,"lable":"1~99人","color":"#CCFFFF"},
{"min":100,"max":999,"lable":"100~999人","color":"#FFFF99"},
{"min":1000,"max":4999,"lable":"1000~4999人","color":"#FF9966"},
{"min":5000,"max":9999,"lable":"5000~9999人","color":"#FFF6666"},
{"min":10000,"max":99999,"lable":"10000~99999人","color":"#CC3333"},
{"min":100000,"lable":"100000+人","color":"#990033"},
]
)
)
#绘制
map.render("全国疫情地图.html")
效果图:
河北省疫情地图
import json
from pyecharts.charts import Map
from pyecharts.options import *
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\地图数据\疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()
data_dict = json.loads(data)
city_data = data_dict["areaTree"][0]["children"][32]["children"]
city_data_list = []
for city_data in city_data :
city_name = city_data["name"]
city_confirm = city_data["total"]["confirm"]
city_data_list.append((city_name,city_confirm))
map = Map()
map.add("河北省确诊人数",city_data_list,"河北")
map.set_global_opts(
title_opts = TitleOpts(title = "河北省疫情地图"),
visualmap_opts = VisualMapOpts(
is_show = True, #是否显示
is_piecewise = True, #是否分段
pieces = [
{"min":1,"max":99,"lable":"1~99人","color":"#CCFFFF"},
{"min":100,"max":999,"lable":"100~999人","color":"#FFFF99"},
{"min":1000,"max":4999,"lable":"1000~4999人","color":"#FF9966"},
{"min":5000,"max":9999,"lable":"5000~9999人","color":"#FFF6666"},
{"min":10000,"max":99999,"lable":"10000~99999人","color":"#CC3333"},
{"min":100000,"lable":"100000+人","color":"#990033"},
]
)
)
map.render("河北省疫情地图.html")
效果图:
柱状图绘制
绘制基础柱状图
通过bar构建基础柱状图(可反转x y轴)
from pyechats.charts import Bar
bar = Bar()
bar.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar.add_yaxis("GDP",[30,20,10],label_opts = LabelOpts(
position = "right"
))
#反转x轴和y轴
bar.reversal_axis()
bar.render("基础柱状图.html")
效果图
基础时间线柱状图绘制
TimeLine() --时间线
柱状图描述的是分类数据,回答的是每一个分类中【有多少?】这个问题,这是柱状图的主线特点,同时柱状图很难动态的描述一个趋势性数据,这里pyecharts为我们提供了一种解决方案------时间线
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType #柱状图主题设置
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar1.add_yaxis("GDP",[30,20,10],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar1.reversal_axis()
bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar2.add_yaxis("GDP",[50,50,20],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
#添加y轴数据并将数值放在图表右侧
bar3.add_yaxis("GDP",[70,60,50],label_opts=LabelOpts(position="right"))
#反转x轴和y轴
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使用方法补充
列表.sort(key = 选择排列依据的函数,reverse = True/False)
- 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse,是否反转排序结果,True表示降序,False表示升序
带名函数形式
#如下嵌套列表,要求对外层列表进行排列,排序的依据是内层列表的第二个元素数字
my_list = [["a",33],["b",55],["c",11]]
#定义排序方法
def choose_sort_key(element) :
return element[1]
my_list.sort(key = choose_sort_key,reverse = True)
print(my_list)
#输出结果为[["b",55],["a",33],["c",11]]
匿名lambda形式
my_list = [["a",33],["b",55],["c",11]]
my_list.sort(key = lambda element : element[1],reverse = True)
print(my_list)
#输出结果与上相同
数据处理
#读取文件
f = open("D:\个人文件\新建文件夹 (2)\资料\第1-12章资料\资料\资料\可视化案例数据\动态柱状图数据\1960-2019全球GDP数据.csv","r",encoding = "GB2312")#简体中文去读取文件
data_lines = f.readlines()
f.close()
#删除第一行数据
data_lines.pop(0)
#将数据格式转换为字典格式,格式为
#{"年份" :[["国家",GDP],["国家",GDP]......],"年份" :[["国家",GDP],["国家",GDP]......]}
#先定义字典
data_dict = {}
for line in data_lines :
year = int(line.split(",")[0]) #通过逗号分割,然后读取年份
country = line.split(",")[1] #读取国家
gdp = float(line.split(",")[2]) #数据中存在科学计数法,可通过将其转变为浮点数的方式进行处理
try :
data_dict[year].append([country,gdp]) #第一次执行字典中并没有指定的key,会报错进而创建空的列表,之后再将国家数据放入新列表中
except KeyError :
data_dict[year] = []
data_dict[year].append([country,gdp])
#得到了各个年份各个国家对应的gdp值
绘图
from pyecharts.charts import Bar,TimeLine
from pyecharts.options import *
from pyecharts.globals import ThemeType
timeline = TimeLine("theme" : ThemeType.LIGHT)#设置主题
#排序年份 将字典中的key全部取出
sorted_list = sorted(data_dict.keys())
for year in sorted_list : #在一年中对国家gdp从大到小进行排序
data_dict[year].sort(key = lambda element : element[1],reverse = True)
#取出本年份前八名的国家
year_data = data_dict[year][0:8]
x_data = []
y_data = []
#处理x轴和y轴数据
for country_gdp in year_data :
x_data.append(country_gdp[0]) #为x轴添加国家
y_data.append(country_gdp[1]/100000000) #为y轴添加gdp数据 以亿为单位
#构建柱状图
bar = Bar()
#先将x轴和y轴数据反转 使得图表反转后最大值在上面
x_data.reverse()
y_data.reverse()
bar.add_xaxis(x_data)
bar.add_yaxis("GDP(亿)",y_data,label_opts = LabelOpts(position = "right")) #数据在列表右边
#反转x轴和y轴
bar.reversal_axis()
#设置每一年的图表标题
bar.set_global_opts(
title_opts=TitleOpts(title = f"{year}年全球前8GDP数据")
)
#为时间线添加图表
timeline.add(bar,str(year))
#设置时间线自动播放
timeline.add_schema(
play_interval=1000,#自动播放时间间隔,单位毫秒
is_timeline_show=True, #是否显示时间线
is_auto_play=True, #是否自动播放
is_loop_play=False #是否循环播放
)
#绘图
timeline.render("1960-2019全球GDP前8国家.html")