Pyecharts的基本使用

文章目录

  • Pyecharts基本使用
    • 前置知识
    • 1、 基础概念&安装
    • 2、 快速入门
    • 3、 折线图
    • 4、地图
    • 5、柱状图

Pyecharts基本使用

前置知识

  • JSON相关知识,推荐阅读:【JSON是什么】&【JSON的基本使用】

Python中的JSON:

# json数据的格式可以是: 
{"name":"admin","age":18} 


# 也可以是:  
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

Python中的内置模块json能够实现Python数据和JSON数据的转换

# 导入json模块
import json

# 准备符合格式json格式要求的python数据
# data = 3.14
# data = "abc123"
# data = [1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"}]
# data = (1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"})
data = {"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ("tuple",),"dict": {"dict": "dict"}}

# 通过dumps方法把python数据转化为了json数据
data = json.dumps(data)
print(f"json数据:{data}")

# 通过loads方法把json数据转化为了python数据
data = json.loads(data)
print(f"Python数据:{data}")


"""
转换结果:
data = 3.14
json数据:3.14
Python数据:3.14

data = "abc123"
json数据:"abc123"
Python数据:abc123

data = [1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"}]
json数据:[1, 2.2, "a", ["list"], ["tuple"], {"dict": "dict"}]
Python数据:[1, 2.2, 'a', ['list'], ['tuple'], {'dict': 'dict'}]

data = (1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"})
json数据:[1, 2.2, "a", ["list"], ["tuple"], {"dict": "dict"}]
Python数据:[1, 2.2, 'a', ['list'], ['tuple'], {'dict': 'dict'}]

data = {"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ("tuple",),"dict": {"dict": "dict"}}
json数据:{"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ["tuple"], "dict": {"dict": "dict"}}
Python数据:{'int': 1, 'float': 2.2, 'str': 'a', 'list': ['list'], 'tuple': ['tuple'], 'dict': {'dict': 'dict'}}
"""

注意:①集合数据类型无法转换成JSON,强制转换会报TypeError: Object of type set is not JSON serializable,同时列表、元组、字典不能嵌套集合,否则也无法转换成JSON数据②字典转换还是字典,列表转换还是列表,字符串转换还是字符串,但是元组转换是列表

1、 基础概念&安装

  • 什么是pyecharts

    pyecharts是为了让Python能够能够更好地实现数据可视化而开发的工具。因为Python十分有利于处理数据,ECharts是一款很优秀的数据可视化的开源工具,两者相结合就诞生了pyecharts(pyecharts堪称数据可视化神器)。

    pyecharts官网:pyecharts - A Python Echarts Plotting Library built with love.

    pyecharts画廊:Gallery(该网站含有大量pyecharts的应用示例)

  • 什么是Echarts

    ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。

    ECharts官网:Apache ECharts

    学习网站:ECharts 教程 | 菜鸟教程 (runoob.com)

  • 下载安装

    • 方式一:使用指令安装

      pip install pyecharts -i https://pypi.tuna.tsinghua.edu.cn/simple
      
    • 方式二:使用PyCharm安装

      Pyecharts的基本使用_第1张图片

      PS:我是使用第二种方式的

2、 快速入门

生成一个折线图

test.py:

from pyecharts.charts import Line

# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(['张三', '李四', '王五'])
# 添加y轴数据
line.add_yaxis('分数', [66, 88, 99])
# 生成图表
line.render()

Pyecharts的基本使用_第2张图片

运行render.html文件:

Pyecharts的基本使用_第3张图片

  • pyecharts相关配置属性

    pyecharts模块中有很多的配置选项,常用到2个类别的选项:全局配置选项系列配置选项

    • 全局配置选项可以通过set_global_opts方法来进行配置,相应的选项和选项的功能如下:

      Pyecharts的基本使用_第4张图片

      全局配置项的作用:①配置图表的标题②配置图例③配置鼠标移动效果④配置工具栏等整体配置项

    from pyecharts.charts import Line
    from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
    
    # 得到折线图对象
    line = Line()
    # 添加x轴数据
    line.add_xaxis(['张三', '李四', '王五', '赵六', '钱七', '王八'])
    # 添加y轴数据
    line.add_yaxis('分数', [10, 20, 30, 40, 50, 60])
    
    # 设置全局配置项
    line.set_global_opts(
        # 设置标题
        title_opts=TitleOpts(title="学生成绩单", pos_left="center", pos_bottom="0%"),
        # 是否展示图例(默认是True)
        legend_opts=LegendOpts(is_show=True),
        # 是否展示工具箱(默认是False)
        toolbox_opts=ToolboxOpts(is_show=True),
        # 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
        visualmap_opts=VisualMapOpts(is_show=True)
    )
    
    # 生成图表
    line.render()
    

    PS:详情请参考pyecharts官网

    Pyecharts的基本使用_第5张图片

3、 折线图

示例:疫情折线图

数据文件结构:

Pyecharts的基本使用_第6张图片

Python脚本:

import json

from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts

# 读取文件中的JSON数据
f_us = open('E:/project/Python/day02_数据可视化/txt/美国.txt', 'r', encoding='utf-8')
f_jp = open('E:/project/Python/day02_数据可视化/txt/日本.txt', 'r', encoding='utf-8')
f_in = open('E:/project/Python/day02_数据可视化/txt/印度.txt', 'r', encoding='utf-8')
us_data = f_us.read()
jp_data = f_jp.read()
in_data = f_in.read()

# 去掉文件中不规范的字符串,得到规范的JSON字符串
us_data = us_data.replace('jsonp_1629344292311_69436(', "")  # 去掉开始不规范的字符串
us_data = us_data[:-2]  # 去掉末尾不规范的字符串
jp_data = jp_data.replace('jsonp_1629350871167_29498(', "")  # 去掉开始不规范的字符串
jp_data = jp_data[:-2]  # 去掉末尾不规范的字符串
in_data = in_data.replace('jsonp_1629350745930_63180(', "")  # 去掉开始不规范的字符串
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)

# 获取key(trend)
trend_dict = us_dict['data'][0]['trend']
# trend_dict = jp_dict['data'][0]['trend']
# trend_dict = in_dict['data'][0]['trend']

# 获取key(updateDate)
updateDate_dict = trend_dict['updateDate']

# 只获取2020年的数据(x轴的数据,表示日期)
us_x_data = updateDate_dict[:314]

# 获取y轴的数据
# 获取key(list)
list_list = trend_dict['list']

# 获取确诊数据(y轴的数据)
us_y_data = list_list[0]['data']

# 得到折线图对象
line = Line()
# 添加x轴数据(x轴的数据是共用的,所以只需要添加一份即可)
line.add_xaxis(us_x_data)
# 添加y轴数据(label_opts=LegendOpts(is_show=False)不显示折线图中点的数值)
line.add_yaxis('美国确证人数', us_y_data, label_opts=LegendOpts(is_show=False))

# 设置全局配置项
line.set_global_opts(
    # 设置标题
    title_opts=TitleOpts(title="2020年美国确诊人数折线图", pos_left="center", pos_bottom="0%"),
    # 是否展示图例(默认是True)
    legend_opts=LegendOpts(is_show=True),
    # 是否展示工具箱(默认是False)
    toolbox_opts=ToolboxOpts(is_show=True),
    # 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
    visualmap_opts=VisualMapOpts(is_show=True)
)

# 生成图表
line.render()

Pyecharts的基本使用_第7张图片

4、地图

示例1:绘制全国各省疫情确诊人数分布地图

数据文件的结构:

Pyecharts的基本使用_第8张图片

python脚本:

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

# 读取文件中的JSON数据
f = open('E:/project/Python/day03_地图/txt/疫情.txt', 'r', encoding='utf-8')
data = f.read()
# 关闭文件
f.close()

# 将JSON数据转成Python数据(字典类型)
data_dict = json.loads(data)
# 取得各省的疫情数据(列表类型)
province_list = data_dict['areaTree'][0]['children']
# 取得各省的确证数据()
data_list = list()
for province_data in province_list:
    province_name = province_data['name']  # 省份名称
    province_confirm = province_data['total']['confirm']  # 确诊人数
    data_list.append((province_name, province_confirm))

# 获取地图对象
map = Map()
# 添加数据
map.add('各省份确诊人数', data_list, "china")

# 设置全局配置项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        # 是否展示色卡(默认是True)
        is_show=True,
        # 色卡是否以分块矩形展示(默认是False)
        is_piecewise=True,
        # 设置不同数量对应的颜色展示
        pieces=[
            {"min": 1, "max": 9, "Label": "1-9", "color": "#CCFFFF"},
            {"min": 10, "max": 99, "labe1": "10-99人", "color": "#FFFF99"},
            {"min": 100, "max": 499, "1abe1": "99-499人", "co1or": "#FF9966"},
            {"min": 500, "max": 999, "1abe1": "499-999人", "co1or": "#FF6666"},
            {"min": 1000, "max": 9999, "1abe1": "1000-9999人", "c010r": "#CC3333"},
            {"min": 10000, "1abe1": "10000以上", "col0r": "#990033"}
        ])
)

# 生成地图
map.render()

Pyecharts的基本使用_第9张图片

示例2:绘制省级的确诊人数分布地图

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

# 读取文件中的JSON数据
f = open('E:/project/Python/day03_地图/txt/疫情.txt', 'r', encoding='utf-8')
data = f.read()
# 关闭文件
f.close()

# 将JSON数据转成Python数据(字典类型)
data_dict = json.loads(data)
# 取得湖南省的疫情数据(列表类型)
province_list = data_dict['areaTree'][0]['children'][5]['children']
# 取得湖南省各市的确诊数据
data_list = list()
for province_data in province_list:
    city_name = province_data['name'] + '市' # 城市名称
    city_confirm = province_data['total']['confirm']  # 确诊人数
    data_list.append((city_name, city_confirm))

# 获取地图对象
map = Map()
# 添加数据
# 手动添加湘西土家族苗族自治州的确诊人数(因为给出的JSON数据并没有该地区的疫情数据)
data_list.append(('湘西土家族苗族自治州', 3))
map.add('湖南省各市确诊人数', data_list, "湖南")


# 设置全局配置项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        # 是否展示色卡(默认是True)
        is_show=True,
        # 色卡是否以分块矩形展示(默认是False)
        is_piecewise=True,
        # 设置不同数量对应的颜色展示
        pieces=[
            {"min": 1, "max": 9, "Label": "1-9", "color": "#CCFFFF"},
            {"min": 10, "max": 99, "labe1": "10-99人", "color": "#FFFF99"},
            {"min": 100, "max": 499, "1abe1": "99-499人", "co1or": "#FF9966"},
            {"min": 500, "max": 999, "1abe1": "499-999人", "co1or": "#FF6666"},
            {"min": 1000, "max": 9999, "1abe1": "1000-9999人", "c010r": "#CC3333"},
            {"min": 10000, "1abe1": "10000以上", "col0r": "#990033"}
        ])
)

# 生成地图
map.render()

Pyecharts的基本使用_第10张图片

5、柱状图

示例1:静态柱状图

from pyecharts.charts import Bar
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts

"""
演示基础的柱状图
"""
# 获取柱状图对象
bar = Bar()
# 添加x轴数据
bar.add_xaxis(['美国', '中国', '日本'])
# 添加y轴数据(position='right',将数值标签设置在右边,默认是在上边)
bar.add_yaxis('GDP', [30, 20, 10], label_opts=LabelOpts(position='right'))
# 反转x和y轴
bar.reversal_axis()

# 设置全局配置项
bar.set_global_opts(
    # 设置标题
    title_opts=TitleOpts(title="中美日三国GDP", pos_left="center", pos_bottom="0%"),
    # 是否展示图例(默认是True)
    legend_opts=LegendOpts(is_show=True),
    # 是否展示工具箱(默认是False)
    toolbox_opts=ToolboxOpts(is_show=True),
    # 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
    visualmap_opts=VisualMapOpts(is_show=True)
)

# 生成柱状图
bar.render()

Pyecharts的基本使用_第11张图片

示例2:时间线柱状图

Pyecharts的基本使用_第12张图片

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

# 获取柱状图对象
bar1 = Bar()
bar2 = Bar()
bar3 = Bar()
# 添加x轴数据
bar1.add_xaxis(['美国', '中国', '日本'])
bar2.add_xaxis(['美国', '中国', '日本'])
bar3.add_xaxis(['美国', '中国', '日本'])
# 添加y轴数据(position='right',将数值标签设置在右边,默认是在上边)
bar1.add_yaxis('GDP', [30, 10, 15], label_opts=LabelOpts(position='right'))
bar2.add_yaxis('GDP', [40, 20, 20], label_opts=LabelOpts(position='right'))
bar3.add_yaxis('GDP', [45, 30, 25], label_opts=LabelOpts(position='right'))
# 反转x和y轴
bar1.reversal_axis()
bar2.reversal_axis()
bar3.reversal_axis()

# 创建时间线对象
timeline = Timeline(
    # 设置时间线主题
    {'theme': ThemeType.WHITE}
)
# 添加三个时间点,每个时间点对应一张柱状图
timeline.add(bar1, '2010年GDP')
timeline.add(bar2, '2015年GDP')
timeline.add(bar3, '2020年GDP')

# 自动播放设置
timeline.add_schema(
    # 设置自动播放的间隔时间
    play_interval=1000,
    # 自动播放是否显示时间线(默认是True)
    is_timeline_show=True,
    # 是否自动播放(默认是False)
    is_auto_play=True,
    # 是否循环自动播放(默认是False)
    is_loop_play=True
)

# 通过时间线对象生成柱状图
timeline.render()

Pyecharts的基本使用_第13张图片

测试3:1960年~2019年各国GDP动态变化柱状图

前置知识

列表.sort(key=选择排序依据的函数, reverse=True|False)  # 降序排序
  • key:是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
  • reverse:是否反转排序结果,True表示降序,False表示升序

sort方法示例代码:

lists = [[1, 2, 3], [1, 1, 1], [1, 3, 2]]


def key(element):
    # 按照元素的第2个数据进行排序(也就是索引号为1)
    return element[1]


print(lists)  # [[1, 2, 3], [1, 1, 1], [1, 3, 2]]
lists.sort(key=key, reverse=True)  # 非匿名函数
# lists.sort(key=lambda element: element[1], reverse=True)  # 匿名函数
print(lists)  # [[1, 3, 2], [1, 2, 3], [1, 1, 1]]

数据文件结构:

Pyecharts的基本使用_第14张图片

1960年~2019年各国GDP动态变化柱状图:

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

# 读取文件中的数据
f = open('E:/project/Python/day04_动态柱状图/resources/1960-2019全球GDP数据.csv', 'r', encoding='gbk')
data_lines = f.readlines()
f.close()

# 处理读取的数据
data_lines.pop(0)  # 删除第一条数据

# 将字符串数据转成Python数据(字典)
data_dict = dict()
for line in data_lines:
    year = int(line.split(',')[0])
    country = line.split(',')[1]
    gdp = float(line.split(',')[2])
    # 将数据封装到字典中({year:[[国家,gdp], [国家,gdp]...], year:[[国家,gdp], [国家,gdp]...] ...})
    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)
    # 取gdp前8的国家(因为国家太多了,有两百多个国家和地区)
    year_data = data_dict[year][0:8]
    x_data = []
    y_data = []
    # 遍历每一年这八个国家的数据,同时赋值x和y轴
    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))


# 设置自动播放
timeline.add_schema(
    play_interval=500,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=True
)

# 生成动态GDP柱状图
timeline.render("1960-2019全球GDP前8国家.html")

Pyecharts的基本使用_第15张图片


参考文章

  • ECharts 教程 | 菜鸟教程 (runoob.com)
  • 【JSON是什么】&【JSON的基本使用】
  • 【pyecharts教程】应该是全网最全的教程了~ - Heywhale.com

你可能感兴趣的:(Big,Data,python,数据分析,json)