PyEcharts 深入学习
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyEcharts 深入学习相关的知识,希望对你有一定的参考价值。
PyEcharts 深入学习
1. PyEcharts 概述
1.1 导入图表类型
和其他库的导入方法一样,在绘图之前首先要在文件开头导入所需图表类型。
from pyecharts.charts import Bar
Bar 类型是柱状图/条形图在 pyEcharts 中的英文名。 pyEcharts 中有很多常用的图表类型如:Pie(饼图) 、wordcloud(词云图)、Scatter(散点图)
等等。
import 我们需要的图标类型后,要像面向对象中的实例化类一样声明图表:
bar = Bar()
1.2 添加数据
实例化图表之后便可以向图表中添加数据。 pyEcharts 中不同类型的图表添加数据的方法不尽相同,但基本原理是类似的,此处以 Bar 类型图表即条形图为例介绍添加数据的方法。
示例如下:
bar.add_xaxis(["Shirts", "Sweaters", "Ties", "Pants", "Windbreaker", "High-heels", "Socks"])
bar.add_yaxis("Merchant-A", [114, 55, 27, 101, 125, 27, 105])
bar.add_yaxis("Merchant-B", [57, 134, 137, 129, 145, 60, 49])
以上代码是向 bar 的 x 轴添加 6 种衣服类型,并向 y 轴分别添加商家 A 和商家 B 的两组销售数据,pyEcharts 会自动绘制每组两行的柱状图。
1.3 设置图表样式
有了数据,就可以设置我们需要的图标样式并添加一些额外的信息。
比如将 x 轴和 y 轴翻转:
bar.reversal_axis()
这一设置类型属于 Bar 图表自带类型。
将标签的位置设置为靠右显示:
bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))
这一设置类型属于系列配置项(Series Option)。系列配置项还可以设置文字类型、图元类型等等。
将标题设置为“Bar-TestPicture”
bar.set_global_opts(title_opts=opts.TitleOpts(title="Bar-TestPicture"))
标题的设置属于全局配置项(Global Option),具体各部分名称可参考下图:
1.4 输出图表
pyEcharts 有多种输出方式以格式,比如嵌入 Web 界面以 html 格式输出、嵌入 Jupyter 输出或者以文件的形式输出 PNG 格式的图片。
make_snapshot(snapshot, bar_chart().render(), "StudentAnswer/student_answer.png")
1.5 链式调用
bar = (
Bar()
.add_xaxis(["Shirts", "Sweaters", "Ties", "Pants", "Windbreaker", "High-heels", "Socks"])
.add_yaxis("Merchant-A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("Merchant-B", [57, 134, 137, 129, 145, 60, 49])
)
1.6 实例
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot
def bar_chart() -> Bar:
# ********* Begin *********#
bar = Bar()
bar.add_xaxis(["Shirts", "Sweaters", "Ties", "Pants", "Windbreaker", "High-heels", "Socks"])
bar.add_yaxis("Merchant-A", [114, 55, 27, 101, 125, 27, 105])
bar.add_yaxis("Merchant-B", [57, 134, 137, 129, 145, 60, 49])
bar.reversal_axis()
bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))
bar.set_global_opts(title_opts=opts.TitleOpts(title="Bar-TestPicture"))
# ********** End **********#
return bar
make_snapshot(snapshot, bar_chart().render(), "StudentAnswer/student_answer.png")
2. PyEcharts 直角坐标系图表之柱状图/条形图
2.1 导入所需包
导入语句如下:
from pyecharts.charts import Bar
为了方便构造数据,我们还导入了 PyEcharts 提供的虚拟数据包,如下所示:
from pyecharts.faker import Faker
此外还导入全局变量中的 ThemeType 辅助设置主题类型。
from pyecharts.globals import ThemeType
具体主题参见:官方文档
2.2 构造数据
通过 PyEcharts 提供的虚拟数据包 Faker,我们可以用如下语句分别构造用于 x 轴和 y 轴的数据:
data_x = Faker.choose()
data_y_1 = Faker.values()
data_y_2 = Faker.values()
其中,Faker包中的 choose 方法会随机选择一组属性,而 values 方法则生成随机的数据值。
2.3 直角坐标系图表通用方法
直角坐标系图表继承自 RectChart, 都拥有以下方法:
新增 X 轴数据:
def add_xaxis(
# X 轴数据项
xaxis_data: Sequence
)
扩展 X/Y 轴:
def extend_axis(
# 扩展 X 坐标轴数据项
xaxis_data: Sequence = None,
# 扩展 X 坐标轴配置项,参考 `global_options.AxisOpts`
xaxis: Union[opts.AxisOpts, dict, None] = None,
# 新增 Y 坐标轴配置项,参考 `global_options.AxisOpts`
yaxis: Union[opts.AxisOpts, dict, None] = None,
)
翻转 XY 轴数据:
def reversal_axis():
添加 dataset 组件:
def add_dataset(
# 原始数据。一般来说,原始数据表达的是二维表。
source: types.Union[types.Sequence, types.JSFunc] = None,
# 使用 dimensions 定义 series.data 或者 dataset.source 的每个维度的信息。
dimensions: types.Optional[types.Sequence] = None,
# dataset.source 第一行/列是否是 维度名 信息。可选值:
# null/undefine(对应 Python 的 None 值):默认,自动探测。
# true:第一行/列是维度名信息。
# false:第一行/列直接开始是数据。
source_header: types.Optional[bool] = None,
2.4 柱状图 Y 轴配置项
柱状图 Y 轴配置接口如下:
class Bar(
# 初始化配置项,参考 `global_options.InitOpts`
init_opts: opts.InitOpts = opts.InitOpts()
)
func pyecharts.charts.Bar.add_yaxis
def add_yaxis(
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 系列数据
y_axis: Sequence[Numeric, opts.BarItem, dict],
# 是否选中图例
is_selected: bool = True,
# 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。
xaxis_index: Optional[Numeric] = None,
# 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。
yaxis_index: Optional[Numeric] = None,
# 是否启用图例 hover 时的联动高亮
is_legend_hover_link: bool = True,
# 系列 label 颜色
color: Optional[str] = None,
# 是否显示柱条的背景色。通过 backgroundStyle 配置背景样式。
is_show_background: bool = False,
# 每一个柱条的背景样式。需要将 showBackground 设置为 true 时才有效。
background_style: types.Union[types.BarBackground, dict, None] = None,
# 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。
stack: Optional[str] = None,
# 柱条的宽度,不设时自适应。
# 可以是绝对值例如 40 或者百分数例如 '60%'。百分数基于自动计算出的每一类目的宽度。
# 在同一坐标系上,此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效,并且是对此坐标系中所有 'bar' 系列生效。
bar_width: types.Union[types.Numeric, str] = None,
# 柱条的最大宽度。比 barWidth 优先级高。
bar_max_width: types.Union[types.Numeric, str] = None,
# 柱条的最小宽度。在直角坐标系中,默认值是 1。否则默认值是 null。比 barWidth 优先级高。
bar_min_width: types.Union[types.Numeric, str] = None,
# 柱条最小高度,可用于防止某数据项的值过小而影响交互。
bar_min_height: types.Numeric = 0,
# 同一系列的柱间距离,默认为类目间距的 20%,可设固定值
category_gap: Union[Numeric, str] = "20%",
# 不同系列的柱间距离,为百分比(如 '30%',表示柱子宽度的 30%)。
# 如果想要两个系列的柱子重叠,可以设置 gap 为 '-100%'。这在用柱子做背景的时候有用。
gap: Optional[str] = "30%",
# 是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。
# 开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。
# 缺点:优化后不能自定义设置单个数据项的样式。
is_large: bool = False,
# 开启绘制优化的阈值。
large_threshold: types.Numeric = 400,
# 使用 dimensions 定义 series.data 或者 dataset.source 的每个维度的信息。
# 注意:如果使用了 dataset,那么可以在 dataset.source 的第一行/列中给出 dimension 名称。
# 于是就不用在这里指定 dimension。
# 但是,如果在这里指定了 dimensions,那么 ECharts 不再会自动从 dataset.source 的第一行/列中获取维度信息。
dimensions: types.Union[types.Sequence, None] = None,
# 当使用 dataset 时,seriesLayoutBy 指定了 dataset 中用行还是列对应到系列上,也就是说,系列“排布”到 dataset 的行还是列上。可取值:
# 'column':默认,dataset 的列对应于系列,从而 dataset 中每一列是一个维度(dimension)。
# 'row':dataset 的行对应于系列,从而 dataset 中每一行是一个维度(dimension)。
series_layout_by: str = "column",
# 如果 series.data 没有指定,并且 dataset 存在,那么就会使用 dataset。
# datasetIndex 指定本系列使用那个 dataset。
dataset_index: types.Numeric = 0,
# 是否裁剪超出坐标系部分的图形。柱状图:裁掉所有超出坐标系的部分,但是依然保留柱子的宽度
is_clip: bool = True,
# 柱状图所有图形的 zlevel 值。
z_level: types.Numeric = 0,
# 柱状图组件的所有图形的z值。控制图形的前后顺序。
# z值小的图形会被z值大的图形覆盖。
# z相比zlevel优先级更低,而且不会创建新的 Canvas。
z: types.Numeric = 2,
# 标签配置项,参考 `series_options.LabelOpts`
label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),
# 标记点配置项,参考 `series_options.MarkPointOpts`
markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None,
# 标记线配置项,参考 `series_options.MarkLineOpts`
markline_opts: Union[opts.MarkLineOpts, dict, None] = None,
# 提示框组件配置项,参考 `series_options.TooltipOpts`
tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,
# 图元样式配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
# 可以定义 data 的哪个维度被编码成什么。
encode: types.Union[types.JSFunc, dict, None] = None,
)
2.5 初始化配置项
class InitOpts(
# 图表画布宽度,css 长度单位。
width: str = "900px",
# 图表画布高度,css 长度单位。
height: str = "500px",
# 图表 ID,图表唯一标识,用于在多图表时区分。
chart_id: Optional[str] = None,
# 渲染风格,可选 "canvas", "svg"
# # 参考 `全局变量` 章节
renderer: str = RenderType.CANVAS,
# 网页标题
page_title: str = "Awesome-pyecharts",
# 图表主题
theme: str = "white",
# 图表背景颜色
bg_color: Optional[str] = None,
)
2.6 实例
-
使用全局变量中的MACARONS主题
-
X 轴数据设置为 data_x
-
添加两组 Y 轴数据。第一组系列名称设置为“商家A”,数据使用 data_y_1
-
第二组系列名称设置为“商家B”,数据使用 data_y_2,是否选中图例设置为否
-
将柱状图标题设置为“Bar-基本示例”
-
为柱状图添加副标题,命名为“我也是通过 dict 进行配置的”
from PreTest import *
from pyecharts import options as opts
from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot
from pyecharts.charts import Bar
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
data_x = Faker.choose()
data_y_1 = Faker.values()
data_y_2 = Faker.values()
def bar_chart() -> Bar:
# ********* Begin *********#
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
.add_xaxis(data_x)
.add_yaxis("商家A",data_y_1)
.add_yaxis("商家B",data_y_2,is_selected=False)
.set_global_opts(
title_opts=opts.TitleOpts(
title="Bar-基本示例",
subtitle="我也是通过 dict 进行配置的"),
)
)
# ********** End **********#
return c
make_snapshot(snapshot, bar_chart().render("Result/render.html"), 'StudentAnswer/student_answer.png') # 输出图片
make_snapshot(snapshot, bar_base(data_x, data_y_1, data_y_2).render(), "StandardAnswer/task1/standard_answer_1.png")
2.7 数据项接口
class BarItem(
# 数据项名称。
name: Optional[str] = None,
# 单个数据项的数值。
value: Optional[Numeric] = None,
# 单个柱条文本的样式设置,参考 `series_options.LabelOpts`。
label_opts: Union[LabelOpts, dict, None] = None,
# 图元样式配置项,参考 `series_options.ItemStyleOpts`
itemstyle_opts: Union[ItemStyleOpts, dict, None] = None,
# 提示框组件配置项,参考 `series_options.TooltipOpts`
tooltip_opts: Union[TooltipOpts, dict, None] = None,
)
2.8 坐标轴配置项
除了用图表自身的坐标轴配置项之外,还可以用全局配置项中的坐标轴配置项来设置坐标轴风格:
class AxisOpts(
# 坐标轴类型。可选:
# 'value': 数值轴,适用于连续数据。
# 'category': 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
# 'time': 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,
# 例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。
# 'log' 对数轴。适用于对数数据。
type_: Optional[str] = None,
# 坐标轴名称。
name: Optional[str] = None,
# 是否显示 x 轴。
is_show: bool = True,
# 只在数值轴中(type: 'value')有效。
# 是否是脱离 0 值比例。设置成 true 后坐标刻度不会强制包含零刻度。在双数值轴的散点图中比较有用。
# 在设置 min 和 max 之后该配置项无效。
is_scale: bool = False,
# 是否反向坐标轴。
is_inverse: bool = False,
# 坐标轴名称显示位置。可选:
# 'start', 'middle' 或者 'center','end'
name_location: str = "end",
# 坐标轴名称与轴线之间的距离。
name_gap: Numeric = 15,
# 坐标轴名字旋转,角度值。
name_rotate: Optional[Numeric] = None,
# 强制设置坐标轴分割间隔。
# 因为 splitNumber 是预估的值,实际根据策略计算出来的刻度可能无法达到想要的效果,
# 这时候可以使用 interval 配合 min、max 强制设定刻度划分,一般不建议使用。
# 无法在类目轴中使用。在时间轴(type: 'time')中需要传时间戳,在对数轴(type: 'log')中需要传指数值。
interval: Optional[Numeric] = None,
# x 轴所在的 grid 的索引,默认位于第一个 grid。
grid_index: Numeric = 0,
# x 轴的位置。可选:
# 'top', 'bottom'
# 默认 grid 中的第一个 x 轴在 grid 的下方('bottom'),第二个 x 轴视第一个 x 轴的位置放在另一侧。
position: Optional[str] = None,
# Y 轴相对于默认位置的偏移,在相同的 position 上有多个 Y 轴的时候有用。
offset: Numeric = 0,
# 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整。
# 默认值是 5
split_number: Numeric = 5,
# 坐标轴两边留白策略,类目轴和非类目轴的设置和表现不一样。
# 类目轴中 boundaryGap 可以配置为 true 和 false。默认为 true,这时候刻度只是作为分隔线,
# 标签和数据点都会在两个刻度之间的带(band)中间。
# 非类目轴,包括时间,数值,对数轴,boundaryGap是一个两个值的数组,分别表示数据最小值和最大值的延伸范围
# 可以直接设置数值或者相对的百分比,在设置 min 和 max 后无效。 示例:boundaryGap: ['20%', '20%']
boundary_gap: Union[str, bool, None] = None,
# 坐标轴刻度最小值。
# 可以设置成特殊值 'dataMin',此时取数据在该轴上的最小值作为最小刻度。
# 不设置时会自动计算最小值保证坐标轴刻度的均匀分布。
# 在类目轴中,也可以设置为类目的序数(如类目轴 data: ['类A', '类B', '类C'] 中,序数 2 表示 '类C'。
# 也可以设置为负数,如 -3)。
min_: Union[Numeric, str, None] = None,
# 坐标轴刻度最大值。
# 可以设置成特殊值 'dataMax',此时取数据在该轴上的最大值作为最大刻度。
# 不设置时会自动计算最大值保证坐标轴刻度的均匀分布。
# 在类目轴中,也可以设置为类目的序数(如类目轴 data: ['类A', '类B', '类C'] 中,序数 2 表示 '类C'。
# 也可以设置为负数,如 -3)。
max_: Union[Numeric, str, None] = None,
# 自动计算的坐标轴最小间隔大小。
# 例如可以设置成1保证坐标轴分割刻度显示成整数。
# 默认值是 0
min_interval: Numeric = 0,
# 自动计算的坐标轴最大间隔大小。
# 例如,在时间轴((type: 'time'))可以设置成 3600 * 24 * 1000 保证坐标轴分割刻度最大为一天。
max_interval: Optional[Numeric] = None,
# 坐标轴刻度线配置项,参考 `global_options.AxisLineOpts`
axisline_opts: Union[AxisLineOpts, dict, None] = None,
# 坐标轴刻度配置项,参考 `global_options.AxisTickOpts`
axistick_opts: Union[AxisTickOpts, dict, None] = None,
# 坐标轴标签配置项,参考 `series_options.LabelOpts`
axislabel_opts: Union[LabelOpts, dict, None] = None,
# 坐标轴指示器配置项,参考 `global_options.AxisPointerOpts`
axispointer_opts: Union[AxisPointerOpts, dict, None] = None,
# 坐标轴名称的文字样式,参考 `series_options.TextStyleOpts`
name_textstyle_opts: Union[TextStyleOpts, dict, None] = None,
# 分割区域配置项,参考 `series_options.SplitAreaOpts`
splitarea_opts: Union[SplitAreaOpts, dict, None] = None,
# 分割线配置项,参考 `series_options.SplitLineOpts`
splitline_opts: Union[SplitLineOpts以上是关于PyEcharts 深入学习的主要内容,如果未能解决你的问题,请参考以下文章