Pyecharts教程1
本教程旨在介绍Pyecharts的基本用法
更加详细内容可以查阅文档:https://pyecharts.org/#/zh-cn/intro
图来自github图床,如果图刷不出来可能是网问题
1. 安装
1.1 介绍
Echarts是由百度开源的可视化工具,具有良好的交互性与精致的图标。Pyecharts则是Echarts的Python实现。
如果你不知道Echarts是否能给你带来帮助,可以去官网https://echarts.apache.org/zh/index.html 查看示例,找到自己想画的图表类型,在决定是否要花时间学习这个工具。如下图是官网的截图:
1.2 pip安装
pip install pyecharts
1.3 源码安装
git clone https://github.com/pyecharts/pyecharts.git
cd pyecharts
pip install -r requirements.txt
python setup.py install
# 或者执行 python install.py
注:本教程所使用的代码都是v1版本后的。
2. 快速上手
2.1 柱状图
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# bar.render_notebook() 表示仅在notebook上显示
# 也可以通过 bar.render() 生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render_notebook() # 在notebook上显示
注:pyecharts 所有方法均支持链式调用。因此上面的代价也可以写成:
from pyecharts.charts import Bar
bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
)
bar.render_notebook()
2.2 折线图
from pyecharts.charts import Line
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.render_notebook()
3. 配置项
3.1 全局配置项
如下图,全局配置项主要能配置6个区域:
- 正副标题: TitleOpts
- 图例: LegendOpts
- 工具箱: ToolboxOpts
- 视觉映射: VisualMapOpts
- 提示框: TooltipOpts
- 区域缩放: DataZoomOpts
下面以折线图为例对这五项进行配置说明。
Base版本
from pyecharts.charts import Line
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.render_notebook()
配置 TitleOpts
全局配置项可通过 set_global_opts
方法设置. 以line.set_global_opts
为例,下面是该函数的所有形参。
line.set_global_opts( title_opts:Union[pyecharts.options.global_options.TitleOpts, dict]=, legend_opts:Union[pyecharts.options.global_options.LegendOpts, dict]=, tooltip_opts:Union[pyecharts.options.global_options.TooltipOpts, dict, NoneType]=None, toolbox_opts:Union[pyecharts.options.global_options.ToolboxOpts, dict]=None, brush_opts:Union[pyecharts.options.global_options.BrushOpts, dict, NoneType]=None, xaxis_opts:Union[pyecharts.options.global_options.AxisOpts, dict, NoneType]=None, yaxis_opts:Union[pyecharts.options.global_options.AxisOpts, dict, NoneType]=None, visualmap_opts:Union[pyecharts.options.global_options.VisualMapOpts, dict, Sequence[Union[pyecharts.options.global_options.VisualMapOpts, dict]], NoneType]=None, datazoom_opts:Union[pyecharts.options.global_options.DataZoomOpts, dict, Sequence[Union[pyecharts.options.global_options.DataZoomOpts, dict]], NoneType]=None, graphic_opts:Union[pyecharts.options.charts_options.BaseGraphic, dict, Sequence[Union[pyecharts.options.charts_options.BaseGraphic, dict]], NoneType]=None, axispointer_opts:Union[pyecharts.options.global_options.AxisPointerOpts, dict, NoneType]=None, )
- 第一个形参
title_opts
可以接收一个TitleOpts类别,或者一个字典. - 第二个形参
legend_opts
可以接收一个LegenOpts类别,或者一个字典 - 以此类推。。。
为折线图添加正副标题
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"))
line.render_notebook()
其中TitleOpts
这个类的详细信息见:https://pyecharts.org/#/zh-cn/global_options?id=titleopts%ef%bc%9a%e6%a0%87%e9%a2%98%e9%85%8d%e7%bd%ae%e9%a1%b9
配置图例
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'))
line.render_notebook()
配置工具箱
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True))
line.render_notebook()
这个工具栏十分强大,可以下载图片、转成柱状图、堆叠图等。
配置提示框
先看一下没有配置的情况下(也就是默认情况)
鼠标悬停在图中间,是没有任何提示的。只要鼠标悬停在数据点时才会有相应的提示。下面对提示框做一个简单的配置:
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"))
line.render_notebook()
再次悬停后,即便在空白地区,不仅能出现提示框,还会显示沿着y轴的所有数据点信息。
配置区域缩放项
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts())
line.render_notebook()
下面的方框是可以滑动的:
配置视觉映射
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts())
line.render_notebook()
3.2 系列配置项
系列配置项包括线条的颜色/粗细、字体大小、节点形状等等。
系列配置项通过.set_series_opts
进行配置。该函数的形参为:
line.set_series_opts( label_opts:Union[pyecharts.options.series_options.LabelOpts, dict, NoneType]=None, linestyle_opts:Union[pyecharts.options.series_options.LineStyleOpts, dict, NoneType]=None, splitline_opts:Union[pyecharts.options.series_options.SplitLineOpts, dict, NoneType]=None, areastyle_opts:Union[pyecharts.options.series_options.AreaStyleOpts, dict, NoneType]=None, axisline_opts:Union[pyecharts.options.global_options.AxisLineOpts, dict, NoneType]=None, markpoint_opts:Union[pyecharts.options.series_options.MarkPointOpts, dict, NoneType]=None, markline_opts:Union[pyecharts.options.series_options.MarkLineOpts, dict, NoneType]=None, markarea_opts:Union[pyecharts.options.series_options.MarkAreaOpts, dict, NoneType]=None, effect_opts:Union[pyecharts.options.series_options.EffectOpts, dict, NoneType]=, tooltip_opts:Union[pyecharts.options.global_options.TooltipOpts, dict, NoneType]=None, itemstyle_opts:Union[pyecharts.options.series_options.ItemStyleOpts, dict, NoneType]=None, **kwargs, )
下面我演示配置其中一个形参:
配置标签label_opts
查看文档,label_opts
的类如下
class LabelOpts(
# 是否显示标签。
is_show: bool = True,
# 标签的位置。可选
# 'top','left','right','bottom','inside','insideLeft','insideRight'
# 'insideTop','insideBottom', 'insideTopLeft','insideBottomLeft'
# 'insideTopRight','insideBottomRight'
position: Union[str, Sequence] = "top",
# 文字的颜色。
# 如果设置为 'auto',则为视觉映射得到的颜色,如系列色。
color: Optional[str] = None,
# 距离图形元素的距离。当 position 为字符描述值(如 'top'、'insideRight')时候有效。
distance: Union[Numeric, Sequence, None] = None,
# 文字的字体大小
font_size: Numeric = 12,
# 文字字体的风格,可选:
# 'normal','italic','oblique'
font_style: Optional[str] = None,
# 文字字体的粗细,可选:
# 'normal','bold','bolder','lighter'
font_weight: Optional[str] = None,
# 文字的字体系列
# 还可以是 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ...
font_family: Optional[str] = None,
# 标签旋转。从 -90 度到 90 度。正值是逆时针。
rotate: Optional[Numeric] = None,
# 刻度标签与轴线之间的距离。
margin: Optional[Numeric] = 8,
# 坐标轴刻度标签的显示间隔,在类目轴中有效。
# 默认会采用标签不重叠的策略间隔显示标签。
# 可以设置成 0 强制显示所有标签。
# 如果设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推。
# 可以用数值表示间隔的数据,也可以通过回调函数控制。回调函数格式如下:
# (index:number, value: string) => boolean
# 第一个参数是类目的 index,第二个值是类目名称,如果跳过则返回 false。
interval: Union[Numeric, str, None]= None,
# 文字水平对齐方式,默认自动。可选:
# 'left','center','right'
horizontal_align: Optional[str] = None,
# 文字垂直对齐方式,默认自动。可选:
# 'top','middle','bottom'
vertical_align: Optional[str] = None,
# 标签内容格式器,支持字符串模板和回调函数两种形式,字符串模板与回调函数返回的字符串均支持用 \n 换行。
# 模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。
# 在 trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。
# 不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量{a}, {b}, {c}, {d}在不同图表类型下代表数据含义为:
# 折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)
# 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)
# 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)
# 饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)
# 示例:formatter: '{b}: {@score}'
#
# 回调函数,回调函数格式:
# (params: Object|Array) => string
# 参数 params 是 formatter 需要的单个数据集。格式如下:
# {
# componentType: 'series',
# // 系列类型
# seriesType: string,
# // 系列在传入的 option.series 中的 index
# seriesIndex: number,
# // 系列名称
# seriesName: string,
# // 数据名,类目名
# name: string,
# // 数据在传入的 data 数组中的 index
# dataIndex: number,
# // 传入的原始数据项
# data: Object,
# // 传入的数据值
# value: number|Array,
# // 数据图形的颜色
# color: string,
# }
formatter: Optional[str] = None,
# 在 rich 里面,可以自定义富文本样式。利用富文本样式,可以在标签中做出非常丰富的效果
# 具体配置可以参考一下 https://www.echartsjs.com/tutorial.html#%E5%AF%8C%E6%96%87%E6%9C%AC%E6%A0%87%E7%AD%BE
rich: Optional[dict] = None,
)
比如想配置一下颜色和字体,则只需传入相应的参数即可
LabelOpts(color='blue', font_size=30)
完整代码:
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts())
line.set_series_opts(label_opts=opts.LabelOpts(color='blue', font_size=20))
line.render_notebook()
[图片上传失败...(image-5419ee-1646122095608)]
从上图看到,配置的结果对所有图中的标签都生效,但是如果只想单独配置一天直线或者某个节点的标签(突出某个节点重要性)要如何做呢?
这个操作略微高级,以后会此专题下令其教程。
4. 进阶学习
通过前面三个部分的学习,我们已经基本掌握的Pyecharts
,至少能用Pyecharts
画点简单的图形。接下来我们继续学习Pyecharts
,深入了解一下其中的一些内置函数。
Pyecharts
可以画多种类型的图表,如折线图(Line
类)、柱状图(Bar
类)等等。所有的图表类都会继承同一个基类(Base
类),下面来了解一下Base
类的API。
func pyecharts.Base.add_js_funcs
# 新增 js 代码,js 代码会被渲染进 HTML 中执行
def add_js_funcs(*fns):
示例:
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line(init_opts=opts.InitOpts(
bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat", "size":"100%"})
)
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts())
line.set_series_opts(label_opts=opts.LabelOpts(color='blue', font_size=20))
# https://s1.ax1x.com/2020/04/02/GJ1ggS.jpg
# https://raw.githubusercontent.com/WinddyAkoky/awesome-gallery/main/20220228163213.png
line.add_js_funcs(
"""
var img = new Image(); img.src = 'https://raw.githubusercontent.com/WinddyAkoky/awesome-gallery/main/20220228163213.png';
"""
)
line.render_notebook()
# line.render()
这块调的不是很好,以后会出一个专门学习这个函数的教程。
func pyecharts.Base.set_colors
# 设置全局 Label 颜色
def set_colors(colors: colors: Sequence[str])
示例:
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts())
line.set_colors(['blue','red'])
line.render_notebook()
func pyecharts.Base.get_options
# 获取全局 options
def get_options() -> dict:
示例:
from pyecharts.charts import Line
from pyecharts import options as opts
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]
line = (
Line()
.add_xaxis(xaxis_data=week_name_list)
.add_yaxis(
series_name="最高气温",
y_axis=high_temperature
)
.add_yaxis(
series_name="最低气温",
y_axis=low_temperature,
)
)
line.set_global_opts(title_opts=opts.TitleOpts(title="这是正标题", subtitle="这是副标题"),
legend_opts=opts.LegendOpts(legend_icon='rect'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
datazoom_opts=opts.DataZoomOpts(),
visualmap_opts=opts.VisualMapOpts())
line.set_colors(['blue','red'])
print(line.get_options())
func pyecharts.Base.dump_options
# 获取全局 options,JSON 格式(JsCode 生成的函数不带引号)
def dump_options() -> str:
# 获取全局 options,JSON 格式(JsCode 生成的函数带引号,在前后端分离传输数据时使用) def dump_options_with_quotes() -> str:
func pyecharts.Base.render
# 渲染图表到 HTML 文件
def render(
# 生成图片路径
path: str = "render.html",
# 模板路径
template_name: str = "simple_chart.html",
# jinja2.Environment 类实例,可以配置各类环境参数
env: Optional[Environment] = None, ) -> str
func pyecharts.Base.render_notebook
# 将图形渲染到 notebook
def render_notebook()
func pyecharts.Base.load_javascript
# 加载 js 资源,在 notebook 环境为 JupyterLab 时需要用到,仅在第一次渲染图前使用加载即可。
def load_javascript()