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