阅读(1302) (0)

pyecharts FAQ

2022-10-24 09:43:06 更新

Q: 如何离线使用 pyecharts?

A: 如果需要在不能联网的环境上使用 pyecharts,需要离线安装 pyecharts 以及提供本地静态资源 HOST 服务。

找一台可以联网的机器,执行以下步骤

# 先安装 pyecharts
$ pip install pyecharts
$ cd ~ && mkidr pyecharts-dep && cd pyecharts-dep
# 将 pyecharts 用到的所有依赖下载到 pyecharts-dep 文件夹
$ pip download pyecharts
# clone pyecharts-assets 项目
$ git clone https://github.com/pyecharts/pyecharts-assets.git
# 将 pyecharts-dep 文件夹打包,传输到需要离线使用 pyecharts 的机器里

切换到离线使用的机器,执行以下步骤

# 1.先安装 pyecharts-dep 中除 pyecharts-X.Y.Z-py2.py3-none-any.whl 的其他包
$ ls | grep -v "^pyecharts*" | xargs pip install
# 2.安装 pyecharts-X.Y.Z-py2.py3-none-any.whl 包
$ ls | grep "pyecharts*" | xargs  pip install
# 3.启动本地服务
$ cd pyecharts-assets && python -m http.server

Q: 关于 JSCode 在 Web 框架中使用前后端分离模式情况下出现解析异常

A1: 由于 json 数据类型的问题,无法将 pyecharts 中的 JSCode 类型的数据转换成 json 数据格式返回到前端页面中使用。因此在使用前后端分离的情况下尽量避免使用 JSCode 进行画图。

A2: 暂时的解决方案如下(以使用 Jquery Ajax 获取数据的情况为例):

前端部分

$.ajax({
    type: "GET",  // POST 获取其他
    url: "<后端的数据接口>",
    dataType: 'json',
    success: function (result) {
        // console.log(result);
        let jsonResult = JSON.stringify(result);
        jsonResult = JSON.parse(jsonResult, function (key, value) {
           if (value.match(/(?:\/\*[\s\S]*?\*\/|\/\/.*?\r?\n|[^{])+\{([\s\S]*)\}$/) !== null) {
               return eval("(" + value + ")");
           } else {
               return value;
           }
        });
        // chart 是事先在全局定义的 echarts 的 init 的变量名
        chart.setOption(jsonResult);
    }
});

后端部分(只给出画图核心的代码部分, 以 Line 图为例)

def line_base() -> Line:
    line = (
        Line()
        .add_xaxis(list(range(10)))
        .add_yaxis(series_name="", y_axis=[randrange(0, 100) for _ in range(10)])
        .set_global_opts(
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(
                    is_show=True, formatter="function(params) { return params + 8;}"
                )
            )
        )
        .dump_options_with_quotes()  # 保留 JS 方法引号
    )
    return line

前端主要就是在解析 json 的情况下通过 JSON.parse 的回调函数进行处理。通过右侧的正则表达式判断是否为 js 的 function ​/(?:\/\*[\s\S]*?\*\/|\/\/.*?\r?\n|[^{])+\{([\s\S]*)\}$/​,从而避免字符串的同名冲突的问题。

示例如下: 

Q: Tooltip 中使用 '\n' 换行无效的问题

A: 请使用 ​<br/>​ 代替 ​\\n