使用phantomjs将pyecharts生成的html渲染为png


以前用pyecharts对每日数据可视化,无奈邮件没法发送包含js的网页,这可累坏我了。考虑了几个小时,最后决定把echarts生成的HTML文件渲染成图片在给邮件发送给各位领导。

echarts的官网有实现方法,比较简单。

snapshot-phantomjs

安装

$ pip install snapshot-phantomjs

snapshot-phantomjs 是 pyecharts + phantomjs 渲染图片的扩展,需要先安装 phantomjs,安装方法请参照官网 phantomjs.org/download.html

使用

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:
    c = (
        Bar()
        .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
        .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
        .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c

make_snapshot(snapshot, bar_chart().render(), "bar0.png")

从此,我过上了高枕无忧的生活……

不过,好景不长。过了一段高枕无忧的生活之后,日报就不发了。不过我依然我行我素,完全不考虑各位领导的感受。(其实是没时间)
最近,我有条件了,开始排查……发现这次日报的报错,我根本无从下手。不管是咨询资深的聪兄,还是资浅的辉明。我都是一筹莫展。作为一名资深的搬运工,我最擅长的是换过几种渲染的方式,和几台linux服务器,几个版本的Python,而不是从源码里面追诉问题。不过,意料之中,报错始终如一。

Traceback (most recent call last):
File "/root/snapshot-phantomjs_test.py", line 19, in
make_snapshot(snapshot, bar_chart().render(), "bar0.png")
File "/usr/local/lib/python3.9/site-packages/pyecharts/render/snapshot.py", line 45, in make_snapshot
raise OSError(content_array)
OSError: ["ReferenceError: Can't find variable: echarts\n\n file:////root/render.html:12 in global code\nReferenceError: Can't find variable: echarts\n\n undefined:1\nnull\n"]


在顶着来自各级领导的层层压力之下,我只能出绝招。百度一下。果然,全球人民还是一条心的,难得有几个遇到这个问题的人,都是说把 echarts.min.js 下载在本地,改代码的引用方式就可以了。不过因为这个鬼东西

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

我确实能访问到,大家都可以,不限种族肤色。可是当我相信的时候,下载下来,改了路径。我想要的图片就呼啦啦的出来了。此时,热泪盈眶~

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

下载到root的家目录,/root

定义一下,

file_path = "{}/".format(os.path.dirname(os.path.abspath("/root/echarts.min.js")))

再定义函数的调用

Bar(init_opts=opts.InitOpts(js_host=file_path))

电脑忽传图片成,初闻涕泪满衣裳。
却看时间早下班,慢关电脑喜欲狂。
白日放歌须纵酒,所以只能到晚上。
即从步行等公交,便下凌塘向饭堂。