上期文章
基础综合案例之可视化
一、json数据格式的转换
什么是json
- 一种轻量级的数据交换格式,可以按照json指定的格式去组织和封装数据
- 本质上是一个带有特定格式的字符串
- 是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互
就是字符串,无非就是一个单独的字典或者一个内部元素都是字典的列表
各种编程语言存储数据的容器不尽相同,在python中字典dict这样的数据类型,在其他语言中可能没有对应的字典
为了能让不同的语言能够相互通用的互相传递数据,json就是一种非常良好的中转数据格式
json格式数据化
列表和字典格式
# json数据的格式可以是:
{"name":"admin","age":18}
# 也可以是:
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
python数据和json数据相互转化
json中的字符串表示要用单引号
# 导入json模块
import json
# 准备符合json格式要求的python数据
data = [{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
# 通过json.dumps(data)方法把python数据转化为json数据
# 如果有中文数据转换,加上ensure_ascii=False参数来确保中文正常转换
data = json.dumps(data, ensure_ascii=False)
# 通过json.loads(data)方法把json数据转化为python数据
data = json.loads(data)
import json
data = [{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
print(type(json_str))
[{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]
<class 'str'>
s = '[{"name": "admin", "age": 18}, {"name": "root", "age": 16}, {"name": "张三", "age": 20}]'
s_python = json.loads(s)
print(s_python)
print(type(s_python))
[{'name': 'admin', 'age': 18}, {'name': 'root', 'age': 16}, {'name': '张三', 'age': 20}]
<class 'list'>
二、pyecharts模块
基础折线图
from pyecharts.charts import Line
line = Line() # 创建line对象
line.add_xaxis(['中国', '美国', '英国'])
line.add_yaxis('GDP', [30, 20, 10])
line.render()
文件中出现html文件,打开之后选择右上角html浏览器打开方式
全局配置选项
针对整个图像进行设置,比如图像的标题、图例和工具箱等
set_global_opts方法
from pyecharts.charts import Line
from pyecharts.options import *
line = Line() # 创建line对象
line.add_xaxis(['中国', '美国', '英国'])
line.add_yaxis('GDP', [30, 20, 10])
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),
)
line.render()
系列配置选项
针对具体的轴数据进行设置,比如对y轴的数据进行个性化的配置
基础地图
from pyecharts.charts import Map
from pyecharts.options import *
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, 'lable': '1-9', 'color': '#CCFFFF'},
{'min': 10, 'max': 99, 'lable': '10-99', 'color': '#FF6666'},
{'min': 100, 'max': 500, 'lable': '100-500', 'color': '#990033'}
]
)
)
map.render()
基础柱状图
from pyecharts.charts import Bar
from pyecharts.options import *
bar = Bar()
bar.add_xaxis(['中国', '美国', '英国'])
bar.add_yaxis('GDP', [30, 20, 10], label_opts=LabelOpts(position='right'))
bar.reversal_axis() # 旋转柱状图的方向,使其变为横向
bar.render('基础柱状图.html')
基础时间线柱状图
创建时间线Timeline()
如果一个Bar、Line对象是一张图表,时间线就是创建一个一维x轴,轴上每一个点就是一个图表对象
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
bar1 = Bar()
bar1.add_xaxis(['中国', '美国', '英国'])
bar1.add_yaxis('GDP', [30, 30, 20], label_opts=LabelOpts(position='right'))
bar1.reversal_axis()
bar1.render('基础柱状图.html')
bar2 = Bar()
bar2.add_xaxis(['中国', '美国', '英国'])
bar2.add_yaxis('GDP', [50, 50, 50], label_opts=LabelOpts(position='right'))
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(['中国', '美国', '英国'])
bar3.add_yaxis('GDP', [70, 60, 60], label_opts=LabelOpts(position='right'))
bar3.reversal_axis()
bar3.render('基础柱状图.html')
timeline = Timeline()
timeline.add(bar1, '点1')
timeline.add(bar2, '点2')
timeline.add(bar3, '点3')
# 用时间线对象绘图
timeline.render('基础时间线柱状图.html')
时间线自动播放设置
add_schema
timeline = Timeline()
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 # 是否循环自动播放
)
timeline.render('基础时间线柱状图.html')
时间线设置主题
from pyecharts.globals import Themetype
timeline = TimeLine(
{"theme": ThemeType.LIGHT}
)
数据处理
json数据整理
网址:懒人工具json在线解析
1.选择json视图
2.复制数据进行格式化
3.点击视图,可以看到文件里面的层级和内容结构
三、基础综合案例
折线图可视化案例
import json
from pyecharts.charts import Line
from pyecharts.options import *
f_us = open("美国.txt", 'r', encoding='UTF-8')
f_jp = open("日本.txt", 'r', encoding='UTF-8')
f_in = open("印度.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)
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']
# 取2020年的数据到314结束
us_x_data = us_trend_data['updateDate'][:314]
us_y_data = us_trend_data['list'][0]['data'][:314]
jp_x_data = jp_trend_data['updateDate'][:314]
jp_y_data = jp_trend_data['list'][0]['data'][:314]
in_x_data = in_trend_data['updateDate'][:314]
in_y_data = in_trend_data['list'][0]['data'][:314]
line = Line()
line.add_xaxis(us_x_data)
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、json数据准备
2、代码实现
import json
from pyecharts.charts import Map
from pyecharts.options import *
f = open('疫情.txt', 'r', encoding='UTF-8')
data = f.read()
f.close()
data_dict = json.loads(data)
province_data_list = data_dict['areaTree'][0]['children']
data_list = []
# 第一种方式
for province_data in province_data_list:
province_confirm = province_data['total']['confirm'] # 确诊人数
if province_data['name'] == '北京' or province_data['name'] =='上海' or province_data['name'] =='天津' or province_data['name'] =='重庆':
province_name = province_data['name']+'市'
elif province_data['name'] == '西藏' or province_data['name'] =='内蒙古':
province_name = province_data['name'] + '自治区'
elif province_data['name'] == '宁夏':
province_name = province_data['name'] + '回族自治区'
elif province_data['name'] == '新疆':
province_name = province_data['name'] + '维吾尔自治区'
elif province_data['name'] == '广西':
province_name = province_data['name'] + '壮族自治区'
else:
province_name = province_data['name'] + '省'
data_list.append((province_name, province_confirm))
# 第二种方式
for province_data in province_data_list:
province_name = province_data['name']
province_confirm = province_data['total']['confirm'] # 确诊人数
if province_data['name'] == '北京' or province_data['name'] == '上海' or province_data['name'] == '天津' or province_data['name'] == '重庆':
data_list.append((province_name+'市', province_confirm))
elif province_data['name'] == '西藏' or province_data['name'] == '内蒙古':
data_list.append((province_name+'自治区', province_confirm))
elif province_data['name'] == '宁夏':
data_list.append((province_name+'回族自治区', province_confirm))
elif province_data['name'] == '新疆':
data_list.append((province_name+'维吾尔自治区', province_confirm))
elif province_data['name'] == '广西':
data_list.append((province_name+'壮族自治区', province_confirm))
else:
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': '#FFF99'},
{'min': 1000, 'max': 4999, 'lable': '1000-4999人', 'color': '#FF9966'},
{'min': 5000, 'max': 9999, 'lable': '5000-99999人', 'color': '#FF6666'},
{'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('疫情.txt', 'r', encoding='UTF-8')
data = f.read()
f.close()
data_dict = json.loads(data)
data_list = []
cities_data = data_dict['areaTree'][0]['children'][3]['children']
for city_data in cities_data:
city_name = city_data['name'] + '市'
if city_name == '济源示范区市':
city_name = city_name[:2] + '市'
city_confirm = city_data['total']['confirm']
data_list.append((city_name, city_confirm))
map = Map()
map.add('河南省疫情分布', 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-99999人', 'color': '#FF6666'},
{'min': 10000, 'max': 99999, 'lable': '10000-99999人', 'color': '#CC3333'},
{'min': 100000, 'lable': '100000+', 'color': '#990033'}
]
)
)
map.render('河南省疫情地图.html')
动态柱状图可视化案例
列表排序
列表.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)
# 排序二,基于lambda匿名函数
my_list.sort(key=lambda element: element[1], reverse=True)
print(my_list)
[['b', 55], ['a', 33], ['c', 11]]
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()
# 删除第一条无需使用的数据
data_lines.pop(0)
timeline = Timeline(
{"theme": ThemeType.LIGHT}
)
# 将数据转换为字典储存,格式为:
# {年份:[[国家, gdp], [国家, gdp]..., [国家, gdp]]}
data_dict = {}
for line in data_lines:
year = int(line.split(',')[0])
country = line.split(',')[1]
gdp = float(line.split(',')[2])
# 如果没有对应的year key值
try:
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp])
# 按照键值key排序即按照年份排序
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:
# 列表数据排序,取前8个国家
data_dict[year].sort(key=lambda element: element[1], reverse=True)
year_data = data_dict[year][0:8]
x_data = []
y_data = []
for country_gdp in year_data:
x_data.append(country_gdp[0])
y_data.append(country_gdp[1]/100000000)
bar = Bar()
x_data.reverse()
y_data.reverse()
bar.add_xaxis(x_data)
bar.add_yaxis('GDP(亿)', y_data, label_opts=LabelOpts(position='right'))
bar.reversal_axis()
bar.set_global_opts(
title_opts=TitleOpts(title=f'{year}年全球前8 GDP国家')
)
timeline.add(bar, str(year))
timeline.add_schema(
play_interval=1000, # 自动播放的时间间隔,单位毫秒
is_timeline_show=True, # 是否在自动播放的时候显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
timeline.render('1960-2019全球GDP前8国家.html')