数据可视化 - 折线图可视化
数据可视化 - 地图
数据可视化 - 动态柱状图
1.json数据格式
-
JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据
-
JSON本质上是一个带有特定格式的字符串
主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互. 类似于:
-
国际通用语言-英语
-
中国56个民族不同地区的通用语言-普通话
python
"""
演示JSON数据和Python字典的相互转换
"""
import json
# 准备列表,列表内每一个元素都是字典,将其转换为JSON Python ------------> JSON : dumps
data = [{"name": "王大锤", "age": 26}, {"name": "诸葛孔明", "age": 48}, {"name": "狄仁杰", "age": 29}]
json_str = json.dumps(data, ensure_ascii=False) # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
# 准备字典,将字典转换成JSON Python ------------> JSON : dumps
Data = {"name": "豹豹", "age": 25}
json_str = json.dumps(Data, ensure_ascii=False) # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
# 将JSON字符串转换为Python数据类型[{k: v, k: v}, {k: v, k: v}] JSON ------------> Python : loads
Str = '[{"name": "豹豹11", "age": 11}, {"name": "豹豹22", "age": 22}]'
l = json.loads(Str)
print(type(l))
print(l)
# 将JSON字符串转换为Python数据类型{k: v, k: v} JSON ------------> Python : loads
Str = '{"name": "豹豹33", "age": 33}'
l = json.loads(Str)
print(type(l))
print(l)
总结:
1. json:是一种轻量级的数据交互格式, 采用完全独立于编程语言的文本格式来存储和表示数据(就是字符串)
Python语言使用JSON有很大优势,因为:JSON无非就是一个单独的字典或一个内部元素都是字典的列表
所以JSON可以直接和Python的字典或列表进行无缝转换。
2. json格式数据转化
通过 json.dumps(data) 方法把python数据转化为了 json数据
python
data = json.dumps(data)
如果有中文可以带上:ensure_ascii=False参数来确保中文正常转换
通过 json.loads(data) 方法把josn数据转化为了 python列表或字典
python
data = json.loads(data)
2.pyecharts模块介绍
画廊:Document
画廊的功能:产生各种各样的图表,可供学习
- 开发可视化图表使用的技术栈是:
Echarts框架的Python版本:PyEcharts包
- 如何安装PyEcharts包:
python
pip install pyecharts
- 如何查看官方示例
打开官方画廊:
https://gallery.pyecharts.org/#/README
3.pyecharts快速入门
- pyecharts模块中有很多的配置选项, 常用到三个类别的选项:
-
全局配置选项
-
系列配置选项
- 全局配置项能做什么?
-
配置图表的标题
-
配置图例
-
配置鼠标移动效果
-
配置工具栏
-
等整体配置项
4.数据处理
python
"""
演示JSON数据和Python字典的相互转换
"""
import json
# 准备列表,列表内每一个元素都是字典,将其转换为JSON Python ------------> JSON : dumps
data = [{"name": "王大锤", "age": 26}, {"name": "诸葛孔明", "age": 48}, {"name": "狄仁杰", "age": 29}]
json_str = json.dumps(data, ensure_ascii=False) # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
# 准备字典,将字典转换成JSON Python ------------> JSON : dumps
Data = {"name": "豹豹", "age": 25}
json_str = json.dumps(Data, ensure_ascii=False) # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
# 将JSON字符串转换为Python数据类型[{k: v, k: v}, {k: v, k: v}] JSON ------------> Python : loads
Str = '[{"name": "豹豹11", "age": 11}, {"name": "豹豹22", "age": 22}]'
l = json.loads(Str)
print(type(l))
print(l)
# 将JSON字符串转换为Python数据类型{k: v, k: v} JSON ------------> Python : loads
Str = '{"name": "豹豹33", "age": 33}'
l = json.loads(Str)
print(type(l))
print(l)
5.创建折线图
1.折线图的基本使用
python
# 演示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", [84, 65, 58])
# 设置全局配置项 set_global_opts来设置
line.set_global_opts(
title_opts=TitleOpts(title="GDP展示", pos_left="center", pos_bottom="%1"), # 标题,左右居中,上下占1%的位置
legend_opts=LegendOpts(is_show=True), # 图例
toolbox_opts=ToolboxOpts(is_show=True), # 工具箱
visualmap_opts=VisualMapOpts(is_show=True), # 视觉映射
)
# 通过render方法,将代码生成图像
line.render()
2.折线图开发
python
import json
# 导入一个包
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts
# 处理数据
f_us = open("F:/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding="UTF-8")
us_data = f_us.read()
f_jp = open("F:/资料/可视化案例数据/折线图数据/日本.txt", "r", encoding="UTF-8")
jp_data = f_jp.read()
f_in = open("F:/资料/可视化案例数据/折线图数据/印度.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]
# 获取确认数据,用于x轴,取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轴的数据
line.add_xaxis(us_x_data)
# 给折线图对象添加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))
# 设置全局配置项 set_global_opts来设置
line.set_global_opts(
title_opts=TitleOpts(title="2020年美日印三国确诊人数折线图", pos_left="center", pos_bottom="1%"), # 标题,左右居中,上下占1%的位置
# legend_opts=LegendOpts(is_show=True), # 图例
# toolbox_opts=ToolboxOpts(is_show=True), # 工具箱
# visualmap_opts=VisualMapOpts(is_show=True), # 视觉映射
)
# 通过render方法,将代码生成图像
line.render()
# 关闭文件
f_us.close()
f_jp.close()
f_in.close()
6.创建地图
1.地图可视化的基本使用
python
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 准备地图对象
map = Map()
# 准备数据
data = [
("北京市", 99),
("上海市", 199),
("湖南省", 256),
("台湾省", 345),
("广东省", 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": "#FFFF99"},
{"min": 100, "max": 199, "lable": "100-199", "color": "#FF9966"},
{"min": 200, "max": 299, "lable": "200-299", "color": "#FF6666"},
{"min": 300, "max": 399, "lable": "300-399", "color": "#CC3333"},
{"min": 400, "max": 499, "lable": "400-499", "color": "#990033"}
]
)
)
# 绘图
map.render()
2.全国疫情可视化地图开发
python
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts
# 读取数据文件
f = open("F:/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
# 关闭文件
f.close()
# JSON数据转换为python字典
dict_data = json.loads(data)
# 读取到各个省份的数据
province_data_list = dict_data["areaTree"][0]["children"]
# 组装每个省份和确诊人数为元组,并将各个省份的数据都封装到列表内
data_list = [] # 绘图需要用的数据列表
for province_data in province_data_list:
name = province_data["name"] # 省份名称
province_confirm = province_data["total"]["confirm"] # 确诊人数
data_list.append((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": 9, "lable": "1-9", "color": "#CCFFFF"},
{"min": 10, "max": 99, "lable": "10-99", "color": "#FFFF99"},
{"min": 100, "max": 999, "lable": "100-999", "color": "#FF9966"},
{"min": 1000, "max": 9999, "lable": "1000-9999", "color": "#FF6666"},
{"min": 10000, "max": 99999, "lable": "10000-99999", "color": "#CC3333"},
{"min": 100000, "max": 999999, "lable": "100000-999999", "color": "#990033"}
]
)
)
# 绘图
map.render("全国疫情地图.html")
3.省级疫情可视化地图开发
python
"""
演示河南省疫情地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts
# 读取文件
f = open("F:/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
# 关闭文件
f.close()
# 获取数据
data_dict = json.loads(data)
province_data_list = data_dict["areaTree"][0]["children"][3]["children"]
# 准备数据
data_list = []
for city_data in province_data_list:
name = city_data["name"] + "市"
Data_List = city_data["total"]["confirm"]
data_list.append((name, Data_List))
# 手动添加城市的数据
data_list.append(("济源市", 5))
# print(data_list)
# 构建地图
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": 10, "lable": "1-9", "color": "#CCFFFF"},
{"min": 11, "max": 20, "lable": "10-20", "color": "#FFFF99"},
{"min": 21, "max": 50, "lable": "21-50", "color": "#FF9966"},
{"min": 51, "max": 100, "lable": "51-100", "color": "#FF6666"},
{"min": 100, "max": 200, "lable": "100-200", "color": "#CC3333"},
{"min": 200, "max": 500, "lable": "200-500", "color": "#990033"}
]
)
)
# 绘图
map.render("河南省疫情地图.html")
7.创建动态柱状图
1.基础柱状图的使用
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()
# 设置数值标签在右侧
# 在Y轴里添加:label_opts=LabelOpts(position="right")
# 绘图
bar.render("基础柱状图演示.html")
2.基础时间线柱状图的使用
python
# 创建时间线对象
timeline = Timeline(
{"theme": ThemeType.LIGHT} # 主图设置颜色
)
python
# 设置自动播放
timeline.add_schema(
play_interval=1000, # 自动播放时间间隔,ms
is_timeline_show=True, # 是否自动播放的时候,显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
python
# 演示基础时间线柱状图的使用
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType
# 使用Bar构建基础柱状图
bar = Bar()
bar2 = Bar()
bar3 = Bar()
# 添加X轴的数据
bar.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right")) #标签在右侧
# 反转X轴和Y轴
bar.reversal_axis()
# 添加X轴的数据
bar2.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar2.add_yaxis("GDP", [50, 10, 30], label_opts=LabelOpts(position="right")) #标签在右侧
# 反转X轴和Y轴
bar2.reversal_axis()
# 添加X轴的数据
bar3.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar3.add_yaxis("GDP", [80, 30, 50], label_opts=LabelOpts(position="right")) #标签在右侧
# 反转X轴和Y轴
bar3.reversal_axis()
# 创建时间线对象
timeline = Timeline(
{"theme": ThemeType.LIGHT} # 主图设置颜色
)
# timeline 对象添加bar柱状图
timeline.add(bar, "2021年GDP")
timeline.add(bar2, "2022年GDP")
timeline.add(bar3, "2023年GDP")
# 设置自动播放
timeline.add_schema(
play_interval=1000, # 自动播放时间间隔,ms
is_timeline_show=True, # 是否自动播放的时候,显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
# 绘图
timeline.render("基础时间线柱状图演示.html")
3.动态时间线主状态的使用
python
"""
拓展列表的sort使用
学习将函数作为参数传递之后,可以学习列表的sort方法来对列表进行自定义排序
"""
# 准备列表
my_list = [["a", 33], ["b", 55], ["c", 11]]
# 排序,基于带名函数 reverse:是否反转
# def choose_sort_key(element):
# return element[1]
#
# my_list.sort(key=choose_sort_key, reverse=True)
# print(my_list)
# 排序,基于;lambda匿名函数
my_list.sort(key=lambda element:element[1], reverse=True)
print(my_list)
python
[['b', 55], ['a', 33], ['c', 11]]
python
"""
演示:GDP动态时间线柱状图的开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
# 读取数据
f = open("F:/学习/1.笔记/Python/资料/资料/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
data_lines = f.readlines() # 读取每一行数据
# print(data_lines)
# 关闭文件
f.close()
# 删除第一条(行)数据
data_lines.pop(0)
# 将数据转换成字典存储,格式wei:
# {年份: [[国家,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]) # gdp数据 float可以将科学计数法的数字转换出来
# 如何判断字典里有没有指定的key呢
try:
data_dict[year].append([country, gdp])
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp])
# print(data_dict)
# 创建时间线对象
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 = []
# print(year_data)
# for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
# 在for循环里将每一年的bar对象添加到时间线里
for country_gdp in year_data:
x_data.append(country_gdp[0]) # x轴添加国家
y_data.append(country_gdp[1] / 1000000000) # y轴添加GDP数据
# print(x_data)
# print(y_data)
# 构建柱状图
x_data.reverse()
y_data.reverse()
bar = Bar()
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}年全球前8国家GDP数据")
)
timeline.add(bar, str(year))
# 设置自动播放
timeline.add_schema(
play_interval=1000, # 自动播放时间间隔,ms
is_timeline_show=True, # 是否自动播放的时候,显示时间线
is_auto_play=True, # 是否自动播放
is_loop_play=True # 是否循环自动播放
)
# 绘图
timeline.render("1960-2019年GDP前8国家.html")