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

image-20240427011425725

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}")

image-20240427165242930

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()

image-20240427171004940

6.全国疫情地图构建

RGB颜色查询对照表:https://www.ab173.com/gongju/ui/rgb.php

image-20240427172032076

地图

image-20240427172424528

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")

image-20240427173448575

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")

image-20240427174400343

9.基础时间线柱状图

时间线

image-20240427175612646

导入包

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")

image-20240427175733278

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动态柱状图

image-20240427205317340

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")
posted @ 2024-12-16 16:47  peng_boke  阅读(3)  评论(0编辑  收藏  举报