Python jinja2实现Echarts5绘图

发布时间:2021-12-03 公开文章

Base

Github加速

 
点此查看

Civil

土木分类资料

 
点此查看

Python

Python编程学习

 
点此查看

Games

JS前端编程学习

 
点此查看

背景

本主在最初接触可视化的时候,也尝试着echarts,但是当时有人在开发pyecharts库,且其没有系统化的实施方案,尤其是导出图片功能。这几天,看到各大号在宣传Echarts5,看了看,还是有惊喜的地方。

实现

import os
import jinja2
import webbrowser

html="""
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>ECharts</title>
        <!-- 引入 echarts.js -->
        <script src="../echarts5/echarts.min.js"></script>
    </head>
    <body>
        <!-- 为ECharts准备一个具备大小(宽高)的Dom ,后续可以采用Bootstrap布局-->
        <div id="main" style="width: 600px;height:400px;"></div>
        <script type="text/javascript">
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));
            // 指定图表的配置项和数据
            var option = {
                title: {
                    text: 'ECharts 入门示例'
                },
                tooltip: {},
                legend: {
                    data:['销量']
                },
                xAxis: {
                    data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
                },
                yAxis: {},
                series: [{
                    name: '销量',
                    type: 'bar',
                    data: [5, 20, 36, 10, 10, 20]
                }]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        </script>
    </body>
    </html>
"""

full_path = os.getcwd().replace("\\","/") +"/templates/test.html"

# 保存为html文件
with open(full_path, "w", encoding='utf-8') as f:
    f.write(html)

# 系统浏览器打开
webbrowser.open(full_path)

 

 

 

 

 

 

视图模板

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>ECharts</title>
        <!-- 引入 echarts.js -->
        <script src="../echarts5/echarts.min.js"></script>
    </head>
    <body>
        <!-- 为ECharts准备一个具备大小(宽高)的Dom ,后续可以采用Bootstrap布局-->
        <div id="main" style="width: 600px;height:400px;"></div>
        <script type="text/javascript">
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));
			var chart_data = {{chart_data}}
            // 指定图表的配置项和数据
            var option = {
			    toolbox: {
				feature: {
					saveAsImage: {}
				}
				},
                title: {
                    text: chart_data.title
                },
                tooltip: {},
                legend: {
                    data:chart_data.legend
                },
                xAxis: {
                    data: chart_data.x_data
                },
                yAxis: {},
                series: [{
                    name: chart_data.y_label,
                    type: 'bar',
                    data: chart_data.y_data
                }]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        </script>
    </body>
    </html>

jinja2渲染

import json
import os
import jinja2
# from jinja2 import Template
import webbrowser

path = os.getcwd().replace("\\", "/")
temp_path = '/templates/test_flask.html'
full_path = path+temp_path

env = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
temp = env.get_template(temp_path)
# 数据
chart_data = {'title': 'ECharts 入门示例',
              'legend': ['销量'],
              'x_data': ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
              'y_label': '销量',
              'y_data': [5, 20, 36, 10, 10, 20]
              }
# 渲染
temp_out = temp.render(chart_data=chart_data)

# 保存
full_path2 = path+'/templates/test_flask_render.html'
with open(full_path2, 'w', encoding='utf-8') as f:
    f.writelines(temp_out)
    f.close()

# 系统浏览器打开html文件
webbrowser.open(full_path2)

 

 

 

 

#下面的js代码根据canvas文档说明而来,有待测试
JS = 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");'
# 执行 JS 代码并拿到图片 base64 数据
im_info = driver.execute_script(JS)  #执行js文件得到带图片信息的图片数据
im_base64 = im_info.split(',')[1]  #拿到base64编码的图片信息
im_bytes = base64.b64decode(im_base64)  #转为bytes类型
with open('bg.png','wb') as f:  #保存图片到本地
    f.write(img_data)
# 完毕

结语

Echarts5很多图形可以照此拿来即用,结合Bootstrap布局可以实现展板的功能。尤其对于有Django或者Flask基础的道友,可以撇开pychart,尝鲜Echart5带来的快感!