Fork me on GitHub

Pyecharts入门教程

Pyecharts入门教程

本文介绍的是一个国产可视化库Pyecharts库的快速入门,主要内容包含:

  • Pyecharts库及特点
  • 多样主题
  • 快速入门
  • 绘制K线图
  • 绘制柱状图
  • 绘制饼图

所有的文章都会是基于官网的资料和示例,以及自己使用的实际案例。

声明

在此郑重声明:接下来关于pyecharts的全部图形都是基于版本V1.7

写这个声明的原因是因为pyecharts有两个版本:

  • V0.5
  • V1.0

它们二者的语法之间是不兼容的,并不存在太多的联系。目前网上很多的教程和博客都是基于V0.5

但是V0.5以后团队不会再维护了。自己曾经在使用这个库的时候,开始没有意识到这个版本的问题,找到的很多文章中的示例代码都不能直接使用,后来才明白是版本不兼容的原因。

⚠️将来的所有文章都是基于V1.0

⚠️将来的所有文章都是基于V1.0

⚠️将来的所有文章都是基于V1.0

什么是pyecharts

在此,引用官网上的一段话来介绍什么是pyecharts:

Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

说的直白些:pyecharts=python+echarts

特性

高度概括:🐂🍺

  • 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
  • 囊括了 30+ 种常见图表,应有尽有
  • 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
  • 可轻松集成至 Flask,Django 等主流 Web 框架
  • 高度灵活的配置项,可轻松搭配出精美的图表
  • 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持

安装

下面是自己经常安装Python相关库的代码,速度非常快:

1
2
pip install -i https://pypi.douban.com/simple pyecharts==1.7  # 安装pyecharts
pip install -i https://pypi.douban.com/simple pandas # 安装pandas

官方提供的源码安装方式

1
2
3
4
5
$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install
# 或者执行 python install.py

查看版本

1
2
import pyecharts
print(pyecharts.__version__)

官网demo

案例

  1. 默认生成render.html文件
1
2
3
4
5
6
7
from pyecharts.charts import Bar  # V1版本的导入类方式!!!!非常关键,看到这种方式才是V1

bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
bar.render()
  1. 指定文件和路径
1
2
3
4
5
6
7
from pyecharts.charts import Bar

bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家B", [15, 20, 36, 18, 45, 69])

bar.render("firstpyecharts.html") # 也可以传入路径参数
  1. 在notebook中直接出图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 注意:如果在notebook中不出图,需要添加下面的两行代码
# 只需要在顶部声明 CurrentConfig.ONLINE_HOST 即可
from pyecharts.globals import CurrentConfig, OnlineHostType
# OnlineHostType.NOTEBOOK_HOST 默认值为 http://localhost:8888/nbextensions/assets/
CurrentConfig.ONLINE_HOST = OnlineHostType.NOTEBOOK_HOST
# --------------------------

from pyecharts.charts import Bar

bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家B", [15, 20, 36, 18, 45, 69])

bar.render_notebook()

链式调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyecharts.charts import Bar
from pyecharts import options as opts

# V1 版本开始支持链式调用

bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
# 或者直接使用字典参数
# .set_global_opts(title_opts={"text": "主标题", "subtext": "副标题"})
)
bar.render_notebook() # notebook中显示
1
2
3
4
5
6
# 不习惯链式调用的开发者依旧可以单独调用方法
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
bar.render()

解决不出图

如果notebook中没有出图,解决方法在这里:pyecharts v1.5.1+ 起开始支持 Notebook 插件作为静态资源服务。

  • 获取 pyecharts-assets 项目
1
$ git clone https://github.com/pyecharts/pyecharts-assets.git
  • 安装扩展插件
1
2
3
4
$ cd pyecharts-assets
# 安装并激活插件
$ jupyter nbextension install assets
$ jupyter nbextension enable assets/main
  • 配置 pyecharts 全局 HOST
1
2
3
4
5
# 只需要在顶部声明 CurrentConfig.ONLINE_HOST 即可
from pyecharts.globals import CurrentConfig, OnlineHostType

# OnlineHostType.NOTEBOOK_HOST 默认值为 http://localhost:8888/nbextensions/assets/
CurrentConfig.ONLINE_HOST = OnlineHostType.NOTEBOOK_HOST

主题

内置主题类型可查看 pyecharts.globals.ThemeType

1
2
3
4
5
6
7
8
9
10
11
12
13
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType

bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 初始化的时候指定主题
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
)

bar.render_notebook()

下面是目前官网提供支持的主题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
thm = '''
| CHALK = 'chalk' #粉笔风
|
| DARK = 'dark' #暗黑风
|
| ESSOS = 'essos' #厄索斯大陆
|
| INFOGRAPHIC = 'infographic' #信息图
|
| LIGHT = 'light' #明亮风格
|
| MACARONS = 'macarons' #马卡龙
|
| PURPLE_PASSION = 'purple-passion' #紫色激情
|
| ROMA = 'roma' #石榴
|
| ROMANTIC = 'romantic' #浪漫风
|
| SHINE = 'shine' #闪耀风
|
| VINTAGE = 'vintage' #复古风
|
| WALDEN = 'walden' #瓦尔登湖
|
| WESTEROS = 'westeros' #维斯特洛大陆
|
| WHITE = 'white' #洁白风
|
| WONDERLAND = 'wonderland' #仙境
'''

绘制K线图

下面介绍的是使用Pyecharts绘制股票K线图

什么是K线

引用一段来自维基百科的解释:

K线(Candlestick chart)又称“阴阳烛”、“蜡烛线”,是反映价格走势的一种图线,其特色在于一个线段内记录了多项讯息,相当易读易懂且实用有效,广泛用于股票期货贵金属数字货币等行情的技术分析,称为K线分析

据传K线为日本江户时代白米商人本间宗久所发明,用来记录每日的米市行情,研析期货市场。日语中K线称为“蜡烛足(日语:ローソク足)”。

蜡烛线的英文是candlestick chart,日文片假名为キャンドル スティック(KYANDORU SUTIKKU),故中文也称之为K线。

根据每个股每天的:开盘价、最低价、最高价和收盘价绘制的一种走势图线,从中找出个股的规律

获取数据

连接数据直接获取数据

原始数据

1
2
3
4
5
6
7
data = []

for i in cur.fetchall():
data.append(i)

df_stock = pd.DataFrame(data,columns=['ts_code','trade_date','open','close','low','high'])
df_stock

时间转化

在pyecharts中绘制K线图的时候,时间格式使用的是年-月-日的格式,所以需要先对上面的数据进行处理。

上面的数据只是字符串类型:

  • 使用to_datetime()方法转化成时间类型的数据,format参数指定我们想要的格式
  • 通过匿名函数将上一步的时间数据再转成最终的时间格式数据
1
2
3
df_stock['trade_date'] = pd.to_datetime(df_stock['trade_date'], format ='%Y-%m-%d')

df_stock['trade_date'] = df_stock['trade_date'].apply(lambda x: x.strftime('%Y-%m-%d'))

划分代码和证券交易所

将股票代码和证券交易所的代号分开

使用匿名函数和分割函数进行处理,取出相应的数据,增加codeexchange两个字段

个股数据量

查看每个股在规定时间范围内的数据量

1
2
stock_list = df_stock['code'].value_counts().reset_index().rename(columns={'index':'code','code':'number'})
stock_list

绘图

以深证的000001股票为例绘制K线图,下图为数据量:

指定在某个时间段内绘制:

1
2
3
4
# 使用&,不要用and

df_kline = kline[(kline['trade_date'] >= '2020-01-10') & (kline['trade_date'] <= '2020-02-04')]
df_kline

生成列表类型数据

open、close、low、high的4个数据放在一个列表,代表一天的完整数据,再将每天的数据组成新的大列表。

绘图

将上面得到的完整数据导入官网的代码示例中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
c = (
Kline()
.add_xaxis(df_kline['trade_date'].tolist())
.add_yaxis("kline", data_list)
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True),
yaxis_opts=opts.AxisOpts(
is_scale=True,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
title_opts=opts.TitleOpts(title="K线走势图"),
)
)

c.render_notebook()

结果如下图:

绘制柱状图

下面介绍的是如何利用pyecharts绘制各种bar柱状图。主要是参考官网的各种例子进行学习和整理

数值+百分比

在柱状图中同时显示数值和百分比,能够对比不同的组之间的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
list2 = [
{"value": 18, "percent": 18 / (18 + 3)},
{"value": 23, "percent": 23 / (23 + 21)},
{"value": 33, "percent": 33 / (33 + 5)}
]

list3 = [
{"value": 3, "percent": 3 / (18 + 3)},
{"value": 21, "percent": 21 / (23 + 21)},
{"value": 5, "percent": 5 / (33 + 5)}
]

c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 使用的主题
.add_xaxis([1, 2, 3])
.add_yaxis("product1", list2, stack="stack1", category_gap="50%") # 堆叠+间隔
.add_yaxis("product2", list3, stack="stack1", category_gap="50%")
.set_series_opts(
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode( # 显示的形式
"function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
),
)
)
)

c.render_notebook()

x轴标题斜体

解决x轴标题很长的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
c = (
Bar()
.add_xaxis(
[
"名字很长的X轴标签1", # x轴标签
"名字很长的X轴标签2",
"名字很长的X轴标签3"
]
)
.add_yaxis("商家A", [10, 20, 30]) # 加入两组y轴数据
.add_yaxis("商家B", [20, 10, 40])
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # 设置旋转角度
title_opts=opts.TitleOpts(title="Bar-旋转X轴标签", subtitle="标题真的很长"), # 主标题和副标题
)
)

c.render_notebook()

堆叠柱状图-stack

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), stack="stack1") # 两组堆叠数据
.add_yaxis("商家B", Faker.values(), stack="stack1")
.add_yaxis("商家C", Faker.values()) # 不参与堆叠
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(部分)"))
# .render("bar_stack1.html") 用于生成html格式文件
)

c.render_notebook() # notebook在线显示

通过字典设置主副标题

1
2
3
4
5
6
7
8
9
10
11
12
13
c = (
Bar({"theme": ThemeType.LIGHT})
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
# 通过字典形式设置两个标题
title_opts={"text": "主标题(字典设置)", "subtext": "副标题(字典配置)"}
)
# .render("bar_base_dict_config.html")
)

c.render_notebook()

加入工具栏目

右上角的工具栏进行多种操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-显示 ToolBox"),
toolbox_opts=opts.ToolboxOpts(),
legend_opts=opts.LegendOpts(is_show=False),
)
# .render("bar_toolbox.html")
)

c.render_notebook()

设置xy轴名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-XY设置新名字"),
yaxis_opts=opts.AxisOpts(name="Y轴新名字"),
xaxis_opts=opts.AxisOpts(name="X轴新名字"),
)
# .render("bar_xyaxis_name.html")
)

c.render_notebook()

垂直缩放

按照数值大小进行滑动

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.days_attrs)
.add_yaxis("商家A", Faker.days_values, color=Faker.rand_color())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom(垂直活动条)"),
datazoom_opts=opts.DataZoomOpts(orient="vertical"),
)
# .render("bar_datazoom_slider_vertical.html")
)

c.render_notebook()

水平缩放

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.days_attrs)
.add_yaxis("商家A", Faker.days_values)
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
datazoom_opts=opts.DataZoomOpts(),
)
# .render("bar_datazoom_slider.html")
)

c.render_notebook()

双边滑动(水平方向)

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.days_attrs)
.add_yaxis("商家A", Faker.days_values, color=Faker.rand_color())
.set_global_opts(
title_opts=opts.TitleOpts(title="Bar-DataZoom(水平方向双边滑动)"),
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
)
# .render("bar_datazoom_both.html")
)

c.render_notebook()

绘制直方图

1
2
3
4
5
6
7
8
9
10
c = (
Bar()
.add_xaxis(Faker.choose())
# 将间隔设置成0就变成了直方图histogram
.add_yaxis("商家A", Faker.values(), category_gap=0, color=Faker.rand_color())
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-直方图"))
# .render("bar_histogram.html")
)

c.render_notebook()

水平柱状图

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), category_gap=0)
.add_yaxis("商家B", Faker.values(), category_gap=0)
.reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(position="right")) # label的位置
.set_global_opts(title_opts=opts.TitleOpts(title="水平柱状图(间隔为0)"))
# .render("bar_reversal_axis.html")
)

c.render_notebook()

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values())
.add_yaxis("商家B", Faker.values())
.reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(position="right")) # label的位置
.set_global_opts(title_opts=opts.TitleOpts(title="水平柱状图"))
# .render("bar_reversal_axis.html")
)

c.render_notebook()

多个指标联动

来自官网的案例

绘制饼图

饼图在实际的工作还是会经常使用,能够很清晰的显示各类数据和占比情况,曾经在工作中绘制了环饼图和多饼图的结合。本文中介绍的是如何利用Pyecharts绘制饼图和进阶的环状饼图和玫瑰图

  • 基本案例
  • 位置和颜色
  • 图例滚动
  • 环形饼图
  • 多饼图
  • 玫瑰图

导入库

基本案例

下面是一份模拟的月度开支的数据

1
2
3
4
5
6
7
8
c = (
Pie()
.add("", [list(z) for z in zip(x_data, y_data)])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

改变位置和颜色

1
2
3
4
5
6
7
8
9
10
11
c = (
Pie()
.add("",
[list(z) for z in zip(x_data, y_data)],
center=["30%", "50%"],) # 1、距离左边和上边的距离百分比
.set_colors(["blue", "green", "purple", "red", "pink"]) # 2、改变颜色
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度开支"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

图例滚动

当饼图中图例比较多的时候,可以利用滚动的方式,下面是pyecharts自带的数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
Faker.choose() + Faker.choose() + Faker.choose() + Faker.choose(),
Faker.values() + Faker.values() + Faker.values() + Faker.values(),
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Pie-图例滚动"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

环形饼图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
x_data = ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"]
y_data = [335, 310, 234, 135, 1548]

c = (
Pie(init_opts=opts.InitOpts(width="1600px", height="1000px")) # 图形的大小设置
.add(
series_name="访问来源",
data_pair=[list(z) for z in zip(x_data, y_data)],
radius=["15%", "50%"], # 内圈和外圈的大小
center=["30%", "50%"], # 左边距和上边距
label_opts=opts.LabelOpts(is_show=True), # 显示数据和百分比
)
.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical")) # 图例在左边和垂直显示
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
),
)
)

c.render_notebook()

多饼图

玫瑰图

本文标题:Pyecharts入门教程

发布时间:2022年06月15日 - 17:06

原始链接:http://www.renpeter.cn/2022/06/15/Pyecharts%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea