根据echarts生成pyecharts并修改
在plotly系列学习中,plotly的配置最终通过生成json传给前端plotly.js,因此通过修改json或者dict的方式,直接可以更改图表。
pyecharts是一个优秀的框架,使echarts能够被python所使用。但echarts更新太快,同时echarts有很多优秀的案例库,却没有相应的python实现,只能看着眼馋。
通过对plotly的原理分析,再看pyecharts原理,有类似的理念,即pyecharts最终传参数给echarts.js,也即最终生成echarts的配置文件。
那么问题来了,如何通过echarts配置文件反向生成pyecharts,然后就可以利用python自由修改相关属性。如果成功,有如下应用场景:
-
看到好看的echarts图,直接根据echarts配置文件生成python对象,用python完成对数据的更改和标题、图例等的修改,加快开发速度。
-
对不熟悉pyecharts的API的开发者,能够快速上手,通过字典或json快速定位到需要修改的属性,完成修改。
经过对API的尝试阅读,找到一个快速的路径,可以实现该操作,步骤如下:
-
编写javascript代码,生成echarts对象,如mychart,调用mychart.getOption()得到配置,用json进行输出。
-
在python中调用demjson,将json生成python字典,如data。demjson自动将json中的true之类转换为python的True。
-
在pyecharts中找到对应的图表类,如Bar, 生成空的对象如bar
-
修改目标属性,可以对dict 进行操作,也可以使用bar.options=data,然后对bar按pyecharts方式进行修改。
-
调用bar.render()得到bar对象。
在第三步中,也可以对相应图表的超类进行初始化,如对Bar类,超类为RectChart,可以初始化RectChart。
关键代码
javascript端生成配置文件
如果echarts里没有javascript的代码,只有配置文件,就可以省略这一步,但如果有javascript语句,就需要执行后才知道完整的配置,所以需要用代码运行一次。
//省略生成echarts代码,生成图后,添加如下代码:
data=myChart.getOption()//mychart为
let str = JSON.stringify(data,"","\t")
console.log(str)//或者存为文件
假如我们用的图是上证指数图,链接为:
https://echarts.apache.org/examples/zh/editor.html?c=candlestick-sh
python端生成图
对生的Pyecharts空图赋予来自echarts的配置,然后就是见证奇迹的时刻!
import demjson
from pyecharts.charts import Bar
data=demjson.decode(jsontext)#jsontext为上一步生成的str
chart=Bar()
data['title'][0]['text']='更改标题'
#将原图黑色标记点改为2301。
data['series'][0]['markPoint']['data'][0]['value']=2301
chart.options=data
#在Jupyter notebook中显示
chart.render_notebook()
最后生成的图像如下,成功!
修改数据
修改数据也是可以的,上图数据太多,换一个简单的图举例,
百度的基础k线图:https://echarts.apache.org/examples/zh/editor.html?c=candlestick-simple
由于没有动态的javascript语句需要执行,直接复制options内的内容至python
from pyecharts.charts.chart import RectChart
jsontext='''
{
xAxis: {
data: ['2017-10-24', '2017-10-25', '2017-10-26', '2017-10-27']
},
yAxis: {},
series: [
{
type: 'candlestick',
data: [
[20, 34, 10, 38],
[40, 35, 30, 50],
[31, 38, 33, 44],
[38, 15, 5, 42]
]
}
]
}
'''
data=demjson.decode(jsontext)
chart=RectChart()
kline=[
[66, 66, 66, 66],
[40, 35, 30, 50],
[31, 38, 33, 44],
[38, 15, 5, 42],
[31, 38, 33, 66],
]
data['series'][0]['data']=kline
data['xAxis']['data']=['2017-10-24', '2017-10-25', '2017-10-26', '2017-10-27','2017-10-28']
chart.options=data
chart.render_notebook()
最后生的图如下,成功地把第一根线改成了水平线,并添加了一条K线。
结语
当然,最好的方式还是学pyecharts,这样的方式比较pythonic,但有时需要快速弄个模型时,这也不失为一个办法。
pyecharts, 一切皆options