pyecharts 中使用 make_snapshot 时报错 Can‘t find variable 的处理

一、问题描述

使用 pyecharts 画图后,想用 make_snapshot 截图保存,有时会报错:

OSError: ["ReferenceError: Can't find variable: echarts\n\n  file:opt/zwy/lineconnectnull.html:12 in global code\nReferenceError: Can't find variable: echarts\n\n  undefined:1\nnull\n”]

二、问题分析

pyecharts 是生成html文件,并将所画的图加入到这个文件里,这时会引用 echarts.min.js,引用地址是:

https://assets.pyecharts.org/assets/echarts.min.js 

当使用者的网络有问题,或者引用地址有问题导致无法访问时,就无法正常引用这个 js 文件,因此报上边这个 OSError。

三、解决方案

1、用其他地址临时代替默认地址

在 python 中,使用以下代码,导入并临时修改绘图资源的地址:

from pyecharts.globals import CurrentConfig

CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@latest/dist/"

之后正常使用 pyecharts 即可。

好处:pyecharts 的源码不作任何改动,通过重新赋值改变资源挂载地址,以后该地址有变动,要改动也方便。
缺点:每个脚本中都要加入以上语句;不能上网时就无法画图。

2、用其他地址永久代替默认地址

在本地 python/anaconda 目录下找到以下子目录 Lib\site-packages\pyecharts,里边有一个 globals.py 文件,将其备份后打开,在第125行,会看到如下内容:

class _OnlineHost:
    DEFAULT_HOST = "https://assets.pyecharts.org/assets/"
    NOTEBOOK_HOST = "http://localhost:8888/nbextensions/assets/"

将其中的 DEFAULT_HOST 改成一个访问速度比较快的地址,可选项是:

https://cdn.jsdelivr.net/gh/pyecharts/pyecharts-assets@master/assets/
或者
https://cdn.jsdelivr.net/npm/echarts@latest/dist/

修改好后是这个样子:

class _OnlineHost:
    # DEFAULT_HOST = "https://assets.pyecharts.org/assets/"
    DEFAULT_HOST = "https://cdn.jsdelivr.net/gh/pyecharts/pyecharts-assets@master/assets/"
    NOTEBOOK_HOST = "http://localhost:8888/nbextensions/assets/"

将 globals.py 保存退出,之后按正常使用 pyecharts 即可。

好处:一次麻烦,长久方便。
缺点:如果挂载地址有变动,需要用新地址重新替换;不能上网时就无法画图。

3、离线使用

3-1、方法1

3-1-1、下载所需的资源文件
点击跳转到github,然后下载 pyecharts-assets 资源文件

3-1-2、文件解压到本地指定目录,比如 D:\pyecharts_assets\assets

3-1-3、启动本地服务端
在以上目录中,打开命令行窗口,运行命令

python -m http.server	 -b 127.0.0.1 8000	# 启动地址为 127.0.0.1,端口为8000的服务器,实测 启动地址为 0.0.0.0 无效

或者
python -m http.server -d D:\pyecharts_assets	 # 指定资源解压所在的本地目录
python -m http.server -d D:\pyecharts_assets -b 127.0.0.1 8000 	# 指定资源解压所在的本地目录,指定网址和端口

也可以将资源文件解压在局域网中某台电脑的某个目录里,然后将服务器开启在那台电脑上。

3-1-4、临时改动默认的资源地址
在需要画图的代码前加上以下两句,改变画图资源的获取地址为本地

# 配置CurrentConfig.ONLINE_HOST为本机地址资源
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"

之后正常使用 pyecharts。

3-2、方法2(更新)

3-2-1、如果项目保存在 d:\python_projects\projects1,则在 project1 下新建子目录 \pyecharts_assets

3-2-2、 将下载的 echarts.min.js 保存到子目录 \pyecharts_assets 中

3-2-3、脚本中,开头添加一句

LOCAL_JS = "./pyecharts_assets/"

3-2-4、在画图的地方指定资源文件的位置。比如,要画一个折线图:

        line1 = (
            Line(init_opts=opts.InitOpts(bg_color='white', js_host=LOCAL_JS))		# 指定资源文件的位置
            .add_xaxis(data_x)
            .add_yaxis(f'{product_name} 单位净值', nav_data_y,
                       linestyle_opts=opts.LineStyleOpts(width=3),
                       is_symbol_show=False
                       )
        )

此方法亲测有效,相比其他方法,它不需要启动服务,也可本地使用,但是画每个图时都要显式指定资源文件的位置。

四、参考资料

[1]: pyechats 加载慢解决方案
[2]: 提高 Pyecharts 生成的网页的加载速度
[3]: pyecharts 生成网页资源加载缓慢,更换默认echarts.min.js加载地址
[4]: 解决离线状态下使用PyEcharts进行数据可视化绘图时,pyecharts-gallery示例库中的所有html网页打不开、不出图的问题

(2023-06-07 23:35:xx 更新)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值