JSON数据格式

定义

  • JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据

  • JSON本质上是一个带有特定格式的字符串

作用

为了让不同的语言都能够相互通用的传递数据,JSON就是一种非常良好的中转数据格式。

Python中数据结构和JSON的关系

  • python中的字典转成字符串就是JSON

  • python中的列表(列表中的元素是字典)转成字符串就是JSON

Python数据和Json数据的相互转换

Python数据->JSON数据(dumps())

ensure_ascii=False表明不使用ASCII去转换它,而是把它内容直接输出出去。

# 导入模块
import json

# 准备列表,列表中的每一个元素都是字典,将其转换为JSON
data = [{'name': 'Tom', 'age': 20}, {'name': 'Mike', 'age': 10}]

# 使用dumps(),将字典转换为JSON
json_str = json.dumps(data,ensure_ascii=False)
print(type(json_str))
print(json_str)

JSON数据->Python数据(loads())

# 导入模块
import json

# JSON数据
s = '[{"name": "Tom", "age": 20}, {"name": "Mike", "age": 10}]'

# JSON数据转Python数据 list
l = json.loads(s)
print(type(l)) # list
print(l)

# JSON数据
s = '{"name": "Tom", "age":20}'

# JSON数据转成Python数据 dict
l = json.loads(s)
print(type(l)) # dict
print(l)

pyecharts模块

官方文档

示例图

安装

pip install pyecharts

基本折线图

# 导包,导入Line功能构建折线图对象
from pyecharts.charts import Line

# 得到折线图对象
line = Line()

# 添加x轴数据
line.add_xaxis(["中国","美国","英国"])

# 添加y轴数据
line.add_yaxis("GDP",[30,20,10])

# 生成图表
line.render()

配置选项

  • 全局配置,主要是通用的配置,包括标题、Legends、工具箱、视觉映射等
line.set_global_opts(
title_opts=TitleOpts(title="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)
)
  • 系列配置选项,不同的折线可以设置不同属性

数据处理

JSON视图

import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LabelOpts


def read_file(filename):
with open(filename, "r", encoding="utf-8") as file:
return file.read()


def generate_line_chart(x_data, y_data, name):
line.add_xaxis(x_data)
line.add_yaxis(name, y_data, label_opts=LabelOpts(is_show=False))


# 读取文件
us_data = read_file("美国.txt")
jp_data = read_file("日本.txt")
in_data = read_file("印度.txt")
# json转字典
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
# 取出需要属性
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,y轴数据
us_x_data = us_trend_data['updateDate'][: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()
line.set_global_opts(
title_opts=TitleOpts(title="2020年美日印确诊人数对比折线图", pos_left="center", pos_bottom="1%")
)
# 填充x,y轴数据
generate_line_chart(us_x_data, us_y_data, "美国确诊人数")
generate_line_chart(us_x_data, jp_y_data, "日本确诊人数")
generate_line_chart(us_x_data, in_y_data, "印度确诊人数")
line.render()

基本地图

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, # 分段
pieces=[
{"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.options import TitleOpts, VisualMapOpts

# 读取数据文件
with open("疫情.txt", "r", encoding="UTF-8") as f:
data = f.read()

# 将字符串json转换为Python的字典
data_dict = json.loads(data)
province_data_list = data_dict["areaTree"][0]["children"]

# 处理省份名称的逻辑
city = ["北京", "天津", "上海", "重庆"]
province = ["河北", "山西", "黑龙江", "吉林", "辽宁", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "海南", "四川",
"贵州", "云南", "陕西", "甘肃", "青海", "台湾"]
municipality = ["内蒙古", "西藏", "宁夏", "新疆", "广西"]
specialty = ["香港", "澳门"]

data_list = []
for province_data in province_data_list:
province_name = province_data["name"]
if province_name in city:
province_name += "市"
elif province_name in province:
province_name += "省"
elif province_name in municipality:
province_name += {
"内蒙古": "自治区",
"西藏": "自治区",
"宁夏": "回族自治区",
"新疆": "维吾尔自治区",
"广西": "壮族自治区",
}.get(province_name)
data_list.append((province_name, province_data["total"]["confirm"]))

# 创建地图对象
map_chart = Map()

# 添加数据
map_chart.add("各省份确诊人数", data_list, "china")

# 设置全局配置,定制分段的视觉映射
visual_map = VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min": 1, "max": 99, "label": "1~99人", "color": "#CCFFFF"},
{"min": 100, "max": 999, "label": "100~999人", "color": "#FFFF99"},
{"min": 1000, "max": 4999, "label": "1000~4999人", "color": "#FF9966"},
{"min": 5000, "max": 9999, "label": "5000~99999人", "color": "#FF6666"},
{"min": 10000, "max": 99999, "label": "10000~99999人", "color": "#CC3333"},
{"min": 100000, "label": "100000+", "color": "#990033"},
]
)

# 设置全局配置
map_chart.set_global_opts(
title_opts=TitleOpts(title="全国疫情地图"),
visualmap_opts=visual_map
)

# 绘图
map_chart.render("全国疫情地图.html")

省级图形绘制

import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts

# 读取文件
with open("疫情.txt", "r", encoding="UTF-8") as f:
data = f.read()

# 获取河南省数据
data_dict = json.loads(data)
cities_data = data_dict["areaTree"][0]["children"][3]["children"]

# 准备数据为元组并放入列表
data_list = []
for city_data in cities_data:
city_name = city_data["name"] + "市"
city_confirm = city_data["total"]["confirm"]
data_list.append((city_name, city_confirm))

# 手动添加济源市的数据
data_list.append(("济源市", 5))

# 构建地图对象
map_chart = Map()

# 添加数据
map_chart.add("河南省疫情分布", data_list, "河南")

# 设置全局选项
visual_map = VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min": 1, "max": 99, "label": "1~99人", "color": "#CCFFFF"},
{"min": 100, "max": 999, "label": "100~9999人", "color": "#FFFF99"},
{"min": 1000, "max": 4999, "label": "1000~4999人", "color": "#FF9966"},
{"min": 5000, "max": 9999, "label": "5000~99999人", "color": "#FF6666"},
{"min": 10000, "max": 99999, "label": "10000~99999人", "color": "#CC3333"},
{"min": 100000, "label": "100000+", "color": "#990033"},
]
)

map_chart.set_global_opts(
title_opts=TitleOpts(title="河南省疫情地图"),
visualmap_opts=visual_map
)

# 绘图
map_chart.render("河南省疫情地图.html")

基础柱状图

"""
演示基础柱状图的开发
"""
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")

基础时间线柱状图

from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType

def create_bar_chart(x_data, y_data, label_position="right"):
bar = Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("GDP", y_data, label_opts=LabelOpts(position=label_position))
bar.reversal_axis()
return bar

# 数据准备
countries = ["中国", "美国", "英国"]
gdp_data = [
[30, 30, 20],
[50, 50, 50],
[70, 60, 60]
]
points = ["点1", "点2", "点3"]

# 创建时间线对象
timeline = Timeline({"theme": ThemeType.LIGHT})

# 逐个添加柱状图到时间线
for i in range(len(points)):
bar = create_bar_chart(countries, gdp_data[i])
timeline.add(bar, points[i])

# 自动播放设置
timeline.add_schema(
play_interval=1000, # 自动播放的时间间隔,单位毫秒
is_timeline_show=True, # 是否在自动播放的时候显示时间线
is_auto_play=True,
is_loop_play=True
)

# 生成最终的HTML文件
timeline.render("基础时间线柱状图.html")

动态GDP柱形图绘制

效果图中需要

  1. GDP数量处理为亿级别

  2. 有时间轴,按照年份为时间轴的点

  3. x轴和y轴反转,同时每一年的数据只要前8名

  4. 有标题,标题的年份动态更改

  5. 设置主题为LIGHT


"""
演示第三个图表:GDP动态柱状图开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 读取数据
f = open("1960-2019全球GDP数据.csv", "r", encoding="GBK")
data_lines = f.readlines()
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# { 年份: [ [国家, gdp], [国家,gdp], ...... ], 年份: [ [国家, gdp], [国家,gdp], ...... ], ...... }
# { 1960: [ [美国, 123], [中国,321], ...... ], 1961: [ [美国, 123], [中国,321], ...... ], ...... }
# 先定义一个字典对象
data_dict = {}
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 year in sorted_year_list:
# 列表排序
data_dict[year].sort(key=lambda element: element[1], reverse=True)
# 取出本年份前8名的国家
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()
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))


# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
# 在for中,将每一年的bar对象添加到时间线中

# 设置时间线自动播放
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")