最近需要完成一个绘图任务,本来一直用matplotlib绘图,但是系统前端用的echart,为了保持统一,以及echart绘图的确好看,决定还是用一下pyechart,没想到中间遇到不少问题。
问题一、版本问题导致的教程无法适用
上来直接google教程,想要先出一个图看看。
结果看到的教程基本是这样的
from pyecharts import Bar
bar = Bar("我的第一个图表", "这里是副标题")
bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90])# bar.print_echarts_options() # 该行只为了打印配置项,方便调试时使用
bar.render() # 生成本地 HTML 文件
结果一跑,直接报错
ImportError: cannot import name 'Bar' from 'pyecharts'
显然肯定是版本问题,于是我这个时候想还是去找官方文档吧,看到官方文档里明晃晃写着:
很显然,我安装的是最新版本。
于是换成代码
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()
成功。
问题二、markArea绘制
我的图需要对中间某一块进行强调,echart插件是有markArea功能的,那pyechart肯定也有。
这个时候,我已经学聪明了,知道官方文档大概率是有的。于是一直在官方文档看怎么绘制出我想要的结果。
结果没有找到==
然后我直接用pyechart martarea进行搜索,结果没搜到什么有价值的。
没办法,我就直接看了源码,果然,明晃晃的MarkAreaOpts。

于是,我又返回到官方文档。
因为知道了opts是配置项,于是我这次成功找到了,之前一直直奔图表一栏......

但是,文档里基本就是解释了一下参数,并没有example...
但我再次翻阅的时候,在系列配置项最前面看到一句:
Note: 配置项章节应该配合图表类型章节中的 example 阅读。
我觉得我终于找到了地方。胜利大概就在眼前。
没错,翻了好几个line的例图,终于让我找到一个类似的。
没错!!!就是他!!!

至此,画图问题应该解决了。但是我最终需要图片格式,于是我又遇到了问题。
问题三、保存成图,而不是html
我的任务需要直接插入图,html显然无法满足要求。
网上也是有教程的。
比如 https://www.cnblogs.com/my-global/articles/12662614.html
基本方案就是先安装phantomjs,再安装node.js,最后再安装pyecharts-snapshot就可以了。
遗憾的是,我按照流程安装完之后,直接存成png格式,显示文件无法打开。
再各种尝试无果之后,我又打开官方文档(果然,官方文档才是最可靠的==)

按照渲染图片下的snapshot-phantomjs方法,成功绘制出图。可把我开心坏了,但是呢,我最后是要在虚机上起任务的,所以我又把代码转移到虚机上,按照上述一番操作之后,运行我的测试代码。
结果,又又又失败了。。。。。。

这个图上所有的数字、字符全部都无法展示,我还把所有中文都换成了英文,又把渲染等待时间拉长,都不行。
又是一通google,结果找不到相同的问题。
无意中看到一个说可能有字体问题的,于是我死马当成活马医。在虚机上输入
yum install bitmap-fonts bitmap-fonts-cjk
不抱希望地重新跑脚本,结果

成功了!!!!!
最后,贴一下坎坷的这短短的测试代码。
from pyecharts.charts import Line
from pyecharts import options as opts
from snapshot_phantomjs import snapshot
from pyecharts.render import make_snapshot
attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]
line=Line()
line.add_xaxis(attr)
line.add_yaxis("商家B", v2)
line.add_yaxis("商家A", v1)
line.set_series_opts(markarea_opts=opts.MarkAreaOpts(
is_silent=False,
data=[
opts.MarkAreaItem(
name="商家A",
x=(attr[3], attr[4]),
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color="#DCA3A2", opacity=0.5),
)
],
))
line.render(path='snapshot.html', pixel_ratio=3)
make_snapshot(snapshot,'snapshot.html', 'snapshot.png')