Pyecharts教程1

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 查看示例,找到自己想画的图表类型,在决定是否要花时间学习这个工具。如下图是官网的截图:

image

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上显示
image

注: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()
image

3. 配置项

3.1 全局配置项

如下图,全局配置项主要能配置6个区域:

  • 正副标题: TitleOpts
  • 图例: LegendOpts
  • 工具箱: ToolboxOpts
  • 视觉映射: VisualMapOpts
  • 提示框: TooltipOpts
  • 区域缩放: DataZoomOpts
image

下面以折线图为例对这五项进行配置说明。

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

配置 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()
image

其中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()
image

配置工具箱

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

这个工具栏十分强大,可以下载图片、转成柱状图、堆叠图等。

柱状图

配置提示框

先看一下没有配置的情况下(也就是默认情况)


image

鼠标悬停在图中间,是没有任何提示的。只要鼠标悬停在数据点时才会有相应的提示。下面对提示框做一个简单的配置:

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

再次悬停后,即便在空白地区,不仅能出现提示框,还会显示沿着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()
image

下面的方框是可以滑动的:


image

配置视觉映射

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

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

这块调的不是很好,以后会出一个专门学习这个函数的教程。

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

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

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

你可能感兴趣的:(Pyecharts教程1)