PyECharts
前言
我永远朝着自由的彼岸行驶风雨无阻
自由增加了我对世界的饱和度
永远喜欢自己的一切包括不堪
自在摇曳 生生不息
1.pyecharts简介
pyecharts地址:https://05x-docs.pyecharts.org/#/zh-cn/prepare
pyecharts-gallery地址:https://gallery.pyecharts.org/#/README
安装
# 安装
pip install pyecharts
# 验证
python
import pyecharts
2.pyecharts入门
pyecharts模块中有很多的配置选项, 常用到2个类别的选项:
-
全局配置选项
-
系列配置选项
全局配置项:
-
配置图表的标题
-
配置图例
-
配置鼠标移动效果
-
配置工具栏
-
等整体配置项
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts
# 折线图对象
line = Line()
# 添加x轴的数据
line.add_xaxis(["中国","美国","英国"])
# 添加y轴的数据
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)
)
# render方法将代码生成折线图
line.render()
3.数据准备
import json
import os
# 获取当前工作目录
current_directory = os.getcwd()
print(f"current_directory:{current_directory}")
# 数据文件路径
usa_path = os.path.join(current_directory, 'data','美国.txt')
rb_path = os.path.join(current_directory,'data', '日本.txt')
yd_path = os.path.join(current_directory,'data', '印度.txt')
print(f"usa_path:{usa_path}")
print(f"rb_path:{rb_path}")
print(f"yd_path:{yd_path}")
# 读取数据
us_f = open(usa_path,"r",encoding="utf-8")
usa_data =us_f.read()
# 去掉不合JSON规范的开头
usa_data = usa_data.replace("jsonp_1629344292311_69436(","")
# 去掉不合JSON规范的结尾
usa_data = usa_data[:-2]
# json转字典
usa_dict = json.loads(usa_data)
print(f"usa_dict:{usa_dict}")
print(f"usa_dict_type:{type(usa_dict)}")
# 获取trend
trend_data = usa_dict["data"][0]["trend"]
print(f"trend_data:{trend_data}")
# 获取日期数据 用于x轴 取2020年(到314下标)
x_data = trend_data["updateDate"][0:314]
print(f"x_data:{x_data}")
# 获取确认数据,用于y轴,取2020(到314下标)
y_data = trend_data["list"]["0"]["data"]
print(f"y_data:{y_data}")
# 生成图表
4.折线图数据
import json
import os
from pyecharts.charts import Line
from pyecharts.options import LabelOpts, TitleOpts
# 获取当前工作目录
current_directory = os.getcwd()
print(f"current_directory:{current_directory}")
# 数据文件路径
usa_path = os.path.join(current_directory, 'data', '美国.txt')
rb_path = os.path.join(current_directory, 'data', '日本.txt')
yd_path = os.path.join(current_directory, 'data', '印度.txt')
print(f"usa_path:{usa_path}")
print(f"rb_path:{rb_path}")
print(f"yd_path:{yd_path}")
def getZheXianData(file_path, remove_start_str, printstr):
"""
解析json数据
:param file_path: 文件路径
:param remove_start_str: 去取开头的字符串
:param printstr: 日志输出表示
:return: 完整数据 x轴数据 y轴数据
"""
# f = open(file_path, "r", encoding="utf-8")
with open(file_path, "r", encoding="utf-8") as f:
data = f.read()
# 去掉不合JSON规范的开头
data = data.replace(remove_start_str, "")
# 去掉不合JSON规范的结尾
data = data[:-2]
# json转字典
dict = json.loads(data)
print(f"{printstr}_dict:{dict}")
print(f"{printstr}_dict_type:{type(dict)}")
# 获取trend
trend_data = dict["data"][0]["trend"]
print(f"{printstr}_trend_data:{trend_data}")
# 获取日期数据 用于x轴 取2020年(到314下标)
x_data = trend_data["updateDate"][0:314]
print(f"{printstr}_x_data:{x_data}")
# 获取确认数据,用于y轴,取2020(到314下标)
y_data = trend_data["list"][0]["data"]
print(f"{printstr}_y_data:{y_data}")
return trend_data, x_data, y_data
# 美国数据
(usa_trend_data, usa_x_data, usa_y_data) = getZheXianData(usa_path, "jsonp_1629344292311_69436(", "usa")
# 日本数据
(rb_trend_data, rb_x_data, rb_y_data) = getZheXianData(rb_path, "jsonp_1629350871167_29498(", "rb")
# 印度数据
(yd_trend_data, yd_x_data, yd_y_data) = getZheXianData(yd_path, "jsonp_1629350745930_63180(", "yd")
# 生成图表
line = Line()
# x轴数据 x轴是公用的 使用一个国家即可
line.add_xaxis(usa_x_data)
# y轴数据
line.add_yaxis("美国确证人数", usa_y_data, label_opts=LabelOpts(is_show=False))
line.add_yaxis("日本确证人数", rb_y_data, label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度确证人数", yd_y_data, label_opts=LabelOpts(is_show=False))
# 全局选项
line.set_global_opts(
# 标题设置
title_opts=TitleOpts(title="2020美日印三国确诊人数对比折线图", pos_left="center", pos_bottom="1%")
)
# render生成图表
line.render()
#
# # -----------------------美国------------------------------
# # 读取数据
# usa_f = open(usa_path,"r",encoding="utf-8")
# usa_data =usa_f.read()
# # 去掉不合JSON规范的开头
# usa_data = usa_data.replace("jsonp_1629344292311_69436(","")
# # 去掉不合JSON规范的结尾
# usa_data = usa_data[:-2]
# # json转字典
# usa_dict = json.loads(usa_data)
# print(f"usa_dict:{usa_dict}")
# print(f"usa_dict_type:{type(usa_dict)}")
# # 获取trend
# usa_trend_data = usa_dict["data"][0]["trend"]
# print(f"usa_trend_data:{usa_trend_data}")
# # 获取日期数据 用于x轴 取2020年(到314下标)
# usa_x_data = usa_trend_data["updateDate"][0:314]
# print(f"usa_x_data:{usa_x_data}")
# # 获取确认数据,用于y轴,取2020(到314下标)
# usa_y_data = usa_trend_data["list"]["0"]["data"]
# print(f"usa_y_data:{usa_y_data}")
#
# # -----------------------日本------------------------------
# rb_f = open(usa_path,"r",encoding="utf-8")
# ri_data =rb_f.read()
# # 去掉不合JSON规范的开头
# rb_data = ri_data.replace("jsonp_1629350871167_29498(","")
# # 去掉不合JSON规范的结尾
# rb_data = rb_data[:-2]
# # json转字典
# rb_dict = json.loads(rb_data)
# print(f"rb_dict:{rb_dict}")
# print(f"rb_dict_type:{type(rb_dict)}")
# # 获取trend
# rb_trend_data = rb_dict["data"][0]["trend"]
# print(f"rb_trend_data:{rb_trend_data}")
# # 获取日期数据 用于x轴 取2020年(到314下标)
# rb_x_data = rb_trend_data["updateDate"][0:314]
# print(f"rb_x_data:{rb_x_data}")
# # 获取确认数据,用于y轴,取2020(到314下标)
# rb_y_data = rb_trend_data["list"]["0"]["data"]
# print(f"rb_y_data:{rb_y_data}")
#
# # -----------------------印度------------------------------
# yd_f = open(usa_path,"r",encoding="utf-8")
# yd_data =yd_f.read()
# # 去掉不合JSON规范的开头
# yd_data = yd_data.replace("jsonp_1629350745930_63180(","")
# # 去掉不合JSON规范的结尾
# yd_data = yd_data[:-2]
# # json转字典
# yd_dict = json.loads(yd_data)
# print(f"yd_dict:{yd_dict}")
# print(f"yd_dict_type:{type(yd_dict)}")
# # 获取trend
# yd_trend_data = yd_dict["data"][0]["trend"]
# print(f"yd_trend_data:{yd_trend_data}")
# # 获取日期数据 用于x轴 取2020年(到314下标)
# yd_x_data = yd_trend_data["updateDate"][0:314]
# print(f"yd_x_data:{yd_x_data}")
# # 获取确认数据,用于y轴,取2020(到314下标)
# yd_y_data = yd_trend_data["list"]["0"]["data"]
# print(f"yd_y_data:{yd_y_data}")
5.数据可视化案例(地图)
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()
6.全国疫情地图构建
RGB颜色查询对照表:https://www.ab173.com/gongju/ui/rgb.php
地图
import json
import os
from pyecharts.charts import Line, Map
from pyecharts.options import LabelOpts, TitleOpts, VisualMapOpts
# 获取当前工作目录
current_directory = os.getcwd()
# 数据文件路径
file_path = os.path.join(current_directory, 'data', '疫情.txt')
# 读取文件
f = open(file_path,"r",encoding="utf-8")
data = f.read();
f.close()
# json转换为dict
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))
print(f"data_list:{data_list}")
# 创建地图对象
map = Map()
# 添加数据
map.add("各省份确证人数",data_list,"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": "#FFFF99"},
{"min": 100, "max": 499, "label": "99-499人", "color": "#FF9966"},
{"min": 500, "max": 999, "label": "499-999人", "color": "#FF6666"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CC3333"},
{"min": 10000, "label": "10000以上", "color": "#990033"}
]
)
)
# 绘图
map.render("全国疫情地图.html")
7.河南疫情地图绘制
import json
import os
from pyecharts.charts import Line, Map
from pyecharts.options import LabelOpts, TitleOpts, VisualMapOpts
# 获取当前工作目录
current_directory = os.getcwd()
# 数据文件路径
file_path = os.path.join(current_directory, 'data', '疫情.txt')
# 读取文件
f = open(file_path,"r",encoding="utf-8")
data = f.read();
f.close()
# json转换为dict
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 = 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": 9, "label": "1-9人", "color": "#CCFFFF"},
{"min": 10, "max": 99, "label": "10-99人", "color": "#FFFF99"},
{"min": 100, "max": 499, "label": "99-499人", "color": "#FF9966"},
{"min": 500, "max": 999, "label": "499-999人", "color": "#FF6666"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CC3333"},
{"min": 10000, "label": "10000以上", "color": "#990033"}
]
)
)
# 绘图
map.render("河南省疫情地图.html")
8.基础柱状图构建
通过Bar()构建一个柱状图对象
和折线图一样,通过add_xaxis()和add_yaxis()添加x和y轴数据
通过柱状图对象的:reversal_axis(),反转x和y轴
通过label_opts=LabelOpts(position="right")设置数值标签在右侧显示
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
# 柱状图对象
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")
9.基础时间线柱状图
时间线
导入包
from pyecharts.charts import Timeline
timeline = Timeline()
设置主题
timeline = Timeline({"theme":ThemeType.LIGHT})
自动播放
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=True
)
代码:
from pyecharts.charts import Bar, Timeline
from pyecharts.globals import ThemeType
from pyecharts.options import LabelOpts
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GDP",[50,40,30],label_opts=LabelOpts(position="right"))
bar1.reversal_axis()
bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP",[70,60,50],label_opts=LabelOpts(position="right"))
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP",[90,80,70],label_opts=LabelOpts(position="right"))
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")
10.列表排序
列表.sort(key=选择排序依据的函数, reverse=True|False)
-
参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
-
参数reverse,是否反转排序结果,True表示降序,False表示升序
my_list = [["a",11],["b",22],["c",33]]
# 排序 基于带名函数
def choose_sort_key(ele):
"""
列表排序
:param ele:元素
:return:元素第2个元素
"""
return ele[1]
my_list.sort(key=choose_sort_key(),reverse=True)
print(f"choose_sort_key:{my_list}")
# 排序 基于lambda
my_list.sort(key = lambda ele:ele[1],reverse=True)
print(f"lambda:{my_list}")
11.GDP动态柱状图
import json
import os
from pyecharts.charts import Line, Timeline, Bar
from pyecharts.globals import ThemeType
from pyecharts.options import LabelOpts, TitleOpts
# 获取当前工作目录
current_directory = os.getcwd()
print(f"current_directory:{current_directory}")
# 数据文件路径
file_path = os.path.join(current_directory, 'data', '1960-2019全球GDP数据.csv')
# 打开文件
f = open(file_path,"r",encoding="GB2312")
# 读取文件
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
gdp = float(line.split(',')[2])
# 如果不存在key 就会出现KeyError错误 在KeyError中重新添加字典并赋值
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:
# 排序 gdp正序
data_dict[year].sort(key=lambda ele:ele[1],reverse=True)
# 取出年份排序前8的数据
year_data = data_dict[year][0:8]
# x轴数据
x_data = []
# y轴数据
y_data = []
for country in year_data:
# 国家名称
x_data.append(country[0])
# 国家GDP
y_data.append(country[1] / 100000000)
# 构建柱状图
bar = Bar()
# GDP高的数据显示在上面
x_data.reverse()
y_data.reverse()
# 添加x轴数据
bar.add_xaxis(x_data)
# 添加y轴数据
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=True #自动播放
)
# 绘图
timeline.render("1960-2019全球GDP前8国家.html")