1,JSON数据格式
什么是json:json是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据,JSON本质上是一个带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互,类似于:
国际通用语言--英语
中国56个民族不同地区的通用语言-普通话
json用处:各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型,而其他语言可能没有对应的字典 为了让不同的语言都能够相互通用得到互相传递数据,JSON就是一种非常良好的中转数据格式

json格式数据转化

2.pyecharts
Echarts是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图标设计,得到了众多开发者的认可,而python是门富有表达力的语言,很适合用于数据处理,当数据分析遇上数据可视化时,pyecharts诞生了 官网:pyecharts.org
安装pyecharts:pip install pyecharts
打开官方画廊:https://gallery.pyecharts.org/#/README
3.pyecharts快速入门
1.构建一个基础的折线图

代码案例:美日印三国GDP对比
python
# 导包
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
# 处理数据/打开文件
# 美国
f_us = open("D.美国.text","r",encoding="utf-8")
us_data = f_us.read()
# 日本
f_jp = open("D.日本.text","r",encoding="utf-8")
jp_data = f_jp.read()
# 印度
f_in = open("D.印度.text","r",encoding="utf-8")
in_data = f_in.read()
# 去掉不合json的开头
us_data = us_data.replace("美国前面的数字","")
jp_data = jp_data.replace("日本前面的数字","")
in_data = in_data.replace("印度前面的数字","")
# 去掉不合json的结尾
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
# 转为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结束)
x_us_data = us_trend_data["updateDate"][:314]
x_jp_data = jp_trend_data["updateDate"][:314]
x_in_data = in_trend_data["updateDate"][:314]
# 获取确认数据,用于y轴,取2020年(到下标)
y_us_data = us_trend_data["list"][0]["data"][:314]
y_jp_data = jp_trend_data["list"][0]["data"][:314]
y_in_data = in_trend_data["list"][0]["data"][:314]
# 设置全局选项
line.set_global_opts(
# 标题设置
title_opts = TitleOpts(title="美日印疫情感染人数(至2020年)",pos_left="center",pos_top="10%"),
legend_opts = LegendOpts(is_show=True), # 图例
toolbox_opts = ToolboxOpts(is_show=True), # 工具箱
visualmap_opts = VisualMapOpts(is_show=True) #视觉映射
)
# 生成图表
line = Line()
# 添加x轴数据
line.add_xaxis(x_us_data) # x轴是公用的
# 添加y轴数据(设置图例属性,False表示常态不显示,鼠标悬浮显示)
line.add_yaxis("美国确诊人数",y_us_data,label_opts=LabelOpts(is_show=False)) # 添加美国y轴数据
line.add_yaxis("日本确诊人数",y_jp_data,label_opts=LabelOpts(is_show=False)) # 添加日本y轴数据
line.add_yaxis("印度确诊人数",y_in_data,label_opts=LabelOpts(is_show=False)) # 添加印度y轴数据
#关闭文件
f_us.close()
f_jp.close()
f_in.close()
pyecharts的配置选项
pyecharts模块中有很多的配置选项,常用2个类别的选项:
全局配置选项:全局配置可以通过set_global_opts来配置


系列配置选项
2.基础地图构建

基础地图演示:视觉映射器

例示:
python
# 导包
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 准备地图对象
map = Map()
# 准备数据
data = [
("北京市" ,99),
("上海市",199),
("湖南省",299),
("江西省",199),
("广东省",399)
]
# 添加数据
map.add("测试用",data,"china")
# 配置全局属性
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min": 1,"max" : 99,"label": "1-99","color":"#AAAAAA"},
{"min": 100,"max": 199,"label": "100-199","color":"#BBBBBB"},
{"min": 200,"max":299,"label": "200-299","color":"#CCCCCC"},
{"min": 300,"max":399,"label": "300-399","color":"#DDDDDD"}
]
)
)
# 绘图
map.render()
全国地图案例:
python
# 导包
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取数据文件
f = open("D:/疫情.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"]
# 通过for循环取到所有省份的数据
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,"lobel":"1-99人","color": "#CCFFFF"},
{"min": 100,"max": 999,"lobel":"100-999人","color": "#FFFF99"},
{"min": 1000,"max": 4999,"lobel":"1000-4999人","color": "#FF9966"},
{"min": 5000,"max": 9999,"lobel":"5000-9999人","color": "#FF6666"},
{"min": 10000,"max": 99999,"lobel":"10000-99999人","color": "#CC3333"},
{"min": 100000,"lobel":">100000人","color": "#990033"},
]
)
)
# 绘图
map.render("map.html")
地方省市地图案例(河南省):
python
# 导包
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取文件
f = open("D:/疫情.txt","r",encoding="utf-8")
data = f.load(f)
# 关闭文件
f.close()
# 获取省市数据
# json字符串转python字典
data_dict = json.loads(data)
# 取数据
cities_data = data_dict["areaTree"][0]["children"][3]["children"]
# for循环得到各个城市的数据
data_dict = []
for city_data in cities_data:
city_name = city_data["name"] + "市"
city_comfirm = city_data["total"]["comfirm"]
data_dict.append((city_name, city_comfirm))
# 构建地图
map = Map()
# 添加数据
map.add("河南省疫情分布",data_dict,"河南")
# 设置全局选项
map.set_global_opts(
title_opts = TitleOpts(title="河南省疫情地图"), # 标题
visualmap_opts=VisualMapOpts(
is_show=True, # 是否显示
is_piecewise=True, # 是否分段
pieces=[
{"min": 1,"max": 99,"lobel":"1-99人","color": "#CCFFFF"},
{"min": 100,"max": 999,"lobel":"100-999人","color": "#FFFF99"},
{"min": 1000,"max": 4999,"lobel":"1000-4999人","color": "#FF9966"},
{"min": 5000,"max": 9999,"lobel":"5000-9999人","color": "#FF6666"},
{"min": 10000,"max": 99999,"lobel":"10000-99999人","color": "#CC3333"},
{"min": 100000,"lobel":">100000人","color": "#990033"},
]
)
)
# 绘图
map.render("河南省疫情地图.html")
3.动态柱状图开发


例示代码:
python
# 导包
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
# 使用Bar构建基础柱状图
bar = Bar()
# 添加x轴数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(
position="right"
))
# 反转x轴和y轴
bar.reversal_axis()
# 绘图
bar.render("基础柱状图.html")
创建时间线


设置自动播放
时间线设置主题

实例:
python
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts
# 使用Bar构建基础柱状图
# 第一年
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, 40, 30], label_opts=LabelOpts(
position="right"
))
bar3.reversal_axis()
# 构建时间线对象
timeline = Timeline(
{"theme": ThemeType.LIGHT} # 主题为颜色蓝黄粉,备注高亮颜色
)
# 在时间线内添加柱状图对象
timeline.add(bar1,"第一年")
timeline.add(bar2,"第二年")
timeline.add(bar3,"第三年")
# 绘图用时间线对象绘图
timeline.render("基础时间线柱状图.html")
# 自动播放设置
timeline.add_schema(
play_interval=1000, # 自动播放的时间间隔(单位毫秒)
is_timeline_show=True, # 是否在自动播放时,显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
# 绘图
# bar.render("基础柱状图.html")
在正式写GDP数据之前,我们还要先学习列表的sort方法

案例需求:

代码
python
# 导包
import json
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *
# 打开文件
f = open("D:/1960-2019全国GDP数据.csv","r",encoding="GB2312")
data_lines = f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# {年份:[[国家,GDP],[国家,GDP],[国家,GDP],...], 年份:[[国家,GDP],[国家,GDP],[国家,GDP],...],......}
# 定义一个空字典存储
data_dict = {}
# for循环拿到每一行数据
for line in data_lines:
year = int(line.split(",")[0]) # 年份
country = line.split(",")[1] # 国家
gdp = float(line.split(",")[2]) # gdp数据
# 如何判断字典里面有没有指定的key?
try:
data_dict[year].append([country,gdp])
except keyError:
data_dict[year] = []
data_dict[year].append([country,gdp])
# 创建时间线对象
timeline = Timeline(
{"theme": ThemeType.LIGHT} # 主题为颜色蓝黄粉,备注高亮颜色
)
# 排序年份
sorted_year_list = sorted(data_dict.keys())
# for循环依次取出
for year in sorted_year_list:
data_dict[year].sort(key = lambda x:x[1],reverse = True) # 将数据按GDP大小排序
# 取出本年份前八名的国家
year_data = data_dict[year][0,8]
x_data = []
y_data = []
for country_gdp in year_data:
x_data.append(country_gdp[0]) # x轴添加国家
y_data.append(country_gdp[1] / 100000000) # y轴添加gdp数据
# 构建柱状图
bar = Bar()
# 反转设置最高GDP在最上面
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}年全球GDP前8国家")
)
# 在时间线内添加柱状图对象
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")