一、问题描述
使用 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 更新)