本人最近在学习利用pyecharts生成可视化大屏,但是发现目前各网站的教程基本都是照搬和修改官网的内容,可参考性较小,故以此文记录本人踩过的坑。如果内容有误,烦请指出,不胜感激。
颜色处理
以官方demo中的折线图为例,一共有多处可以进行颜色设置,分别是标签颜色,线颜色和节点颜色,如下图:
这些都是使用api:.add_xaxis()
进行配置的,语句如下:
.add_yaxis(
"平均温度",
data_list,
linestyle_opts=opts.LineStyleOpts(color='orange', width=2),
itemstyle_opts=opts.ItemStyleOpts(
border_width=5, border_color="orange", color="black"
)
)
其中linestyle_opts中设置的是线的颜色,而itemstyle_opts会同时设置节点和标签的颜色。
但是有些时候我们不希望节点和标签的颜色都一致,那么有一种解决办法就是设置全局的标签颜色,利用了Base类中的api:.set_colors()
,语句如下:
bar.set_colors('black')
组件分层(Overlap)
在利用pyecharts生成可视化图表时,我们常常会在同一张图表中利用多个组件,比如在一张表中同事画条形图和柱状图。但往往会出现条形图把折线图的部分标签遮盖的情况。这种情况需要利用z_level解决。在搜索站内文章时,发现大多数的文章都只提及了官网中的grid类的z_level使用方法,然而这部分属于组件分层而非图层分层,应参考组件的api文档,下面是关于Bar组件的官方文档:
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,
)
那么想要实现上述功能,仅需运行如下代码:
line1 = (
Line()
.add_xaxis(date_list) # x轴
.add_yaxis(
"数量",
data_list,
linestyle_opts=opts.LineStyleOpts(color='orange', width=2),
itemstyle_opts=opts.ItemStyleOpts(
border_width=5, border_color="orange", color="black"
),
z_level=2
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)
)
)