Python调用echarts5实现数据可视化-02-魅惑黑

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

背景

本主在最初接触可视化的时候,也尝试着echarts,但是当时有人在开发pyecharts库,且其没有系统化的实施方案,尤其是导出图片功能。这几天,看到各大号在宣传Echarts5,看了看,还是有惊喜的地方。接下来尝试使用jinja2、bootstrap实现echarts官方示例的展示。对于有Django、Flask基础的道友,下面的代码可以拿来即用(简单修改)。

 

本期实现:

1.采用黑色背景;

2.使用jinja2的Template函数渲染JS;

Talk is cheap...

代码01-实现魅惑黑背景

import os
import jinja2
from jinja2 import Template
import webbrowser

# 加载基础模板
path = os.getcwd().replace("\\", "/")
base_temp_path = '/templates/base_flask_tmp.html'
base_temp_fullpath = path+base_temp_path
env = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
base_temp = env.get_template(base_temp_path)

# 图像数据组


# 构造all_div
#  <div class="col-md-6" style = "width:400px;float:left;overflow:hidden;">
all_div='''
          <div class="row">
            <div class="col-md-6" style = "width:50%;float:left;overflow:hidden;">
                <div id="main1" style="height:600px;"></div>
            </div>
            <div class="col-md-6" style = "width:50%;float:right;overflow:hidden;">
               <div id="main2" style="height:600px;"></div>
            </div>
          </div>
        '''

# 构造all_js
all_js='''
        <script type="text/javascript">
            var chartDom = document.getElementById('main1');
            var myChart1 = echarts.init(chartDom, 'dark');
            var option;
            
            option = {
                legend: {
                    top: 'bottom'
                },
                toolbox: {
                    show: true,
                    feature: {
                        mark: {show: true},
                        saveAsImage: {show: true}
                    }
                },
                series: [
                    {
                        name: '面积模式',
                        type: 'pie',
                        radius: [50, 250],
                        center: ['50%', '50%'],
                        roseType: 'area',
                        itemStyle: {
                            borderRadius: 8
                        },
                        data: [
                            {value: 40, name: 'rose 1'},
                            {value: 38, name: 'rose 2'},
                            {value: 32, name: 'rose 3'},
                            {value: 30, name: 'rose 4'},
                            {value: 28, name: 'rose 5'},
                            {value: 26, name: 'rose 6'},
                            {value: 22, name: 'rose 7'},
                            {value: 18, name: 'rose 8'}
                        ]
                    }
                ]
            };
            
            option && myChart1.setOption(option);
        
        var chartDom = document.getElementById('main2');
        var myChart2 = echarts.init(chartDom, 'dark');
        var option;
        
        option = {
            title: {
                text: '某地区蒸发量和降水量',
                subtext: '纯属虚构'
            },
            tooltip: {
                trigger: 'axis'
            },
            legend: {
                data: ['蒸发量', '降水量']
            },
            toolbox: {
                show: true,
                feature: {
                    magicType: {show: true, type: ['line', 'bar']},
                    saveAsImage: {show: true}
                }
            },
            calculable: true,
            xAxis: [
                {
                    type: 'category',
                    data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                }
            ],
            yAxis: [
                {
                    type: 'value'
                }
            ],
            series: [
                {
                    name: '蒸发量',
                    type: 'bar',
                    data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
                    markPoint: {
                        data: [
                            {type: 'max', name: '最大值'},
                            {type: 'min', name: '最小值'}
                        ]
                    },
                    markLine: {
                        data: [
                            {type: 'average', name: '平均值'}
                        ]
                    }
                },
                {
                    name: '降水量',
                    type: 'bar',
                    data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
                    markPoint: {
                        data: [
                            {name: '年最高', value: 182.2, xAxis: 7, yAxis: 183},
                            {name: '年最低', value: 2.3, xAxis: 11, yAxis: 3}
                        ]
                    },
                    markLine: {
                        data: [
                            {type: 'average', name: '平均值'}
                        ]
                    }
                }
            ]
        };
        
        option && myChart2.setOption(option);

        
        var charts = [myChart1,myChart2];
        window.onresize = function(){
            for(var i = 0; i < charts.length; i++){
                charts[i].resize();
            }
        };

        
        </script>
        
        '''

# jinja2 渲染模板
temp_out = base_temp.render(all_div=all_div,all_js=all_js)


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

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

 

 

 

 

 

 

代码02-Template()渲染JS

import os
import jinja2
from jinja2 import Template
import webbrowser

# 加载基础模板
path = os.getcwd().replace("\\", "/")
base_temp_path = '/templates/base_flask_tmp.html'
base_temp_fullpath = path+base_temp_path
env = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
base_temp = env.get_template(base_temp_path)

# 图像数据组


# 构造all_div
#  <div class="col-md-6" style = "width:400px;float:left;overflow:hidden;">
all_div='''
          <div class="row">
            <div class="col-md-6" style = "width:50%;float:left;overflow:hidden;">
                <div id="main1" style="height:600px;"></div>
            </div>
            <div class="col-md-6" style = "width:50%;float:right;overflow:hidden;">
               <div id="main2" style="height:600px;"></div>
            </div>
          </div>
        '''
pie_data={ 'name': '面积模式',
        'borderRadius': 8,
        'data': [
            {'value': 40, 'name': 'rose 1'},
            {'value': 38, 'name': 'rose 2'},
            {'value': 32, 'name': 'rose 3'},
            {'value': 30, 'name': 'rose 4'},
            {'value': 28, 'name': 'rose 5'},
            {'value': 26, 'name': 'rose 6'},
            {'value': 22, 'name': 'rose 7'},
            {'value': 18, 'name': 'rose 8'}
        ],
        }


# 构造all_js
all_js='''
        <script type="text/javascript">         
            var chartDom = document.getElementById('main1');
            var myChart1 = echarts.init(chartDom, 'dark');
            var option;
            var pie_data = {{pie_data}}
            option = {
                legend: {
                    top: 'bottom'
                },
                toolbox: {
                    show: true,
                    feature: {
                        mark: {show: true},
                        saveAsImage: {show: true}
                    }
                },
                series: [
                    {
                        name: pie_data.name,
                        type: 'pie',
                        radius: [50, 250],
                        center: ['50%', '50%'],
                        roseType: 'area',
                        itemStyle: {
                            borderRadius: pie_data.borderRadius
                        },
                        data: pie_data.data
                    }
                ]
            };
            
        option && myChart1.setOption(option);
        
        var chartDom = document.getElementById('main2');
        var myChart2 = echarts.init(chartDom, 'dark');
        var option;
        
        option = {
            title: {
                text: '某地区蒸发量和降水量',
                subtext: '纯属虚构'
            },
            tooltip: {
                trigger: 'axis'
            },
            legend: {
                data: ['蒸发量', '降水量']
            },
            toolbox: {
                show: true,
                feature: {
                    magicType: {show: true, type: ['line', 'bar']},
                    saveAsImage: {show: true}
                }
            },
            calculable: true,
            xAxis: [
                {
                    type: 'category',
                    data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                }
            ],
            yAxis: [
                {
                    type: 'value'
                }
            ],
            series: [
                {
                    name: '蒸发量',
                    type: 'bar',
                    data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
                    markPoint: {
                        data: [
                            {type: 'max', name: '最大值'},
                            {type: 'min', name: '最小值'}
                        ]
                    },
                    markLine: {
                        data: [
                            {type: 'average', name: '平均值'}
                        ]
                    }
                },
                {
                    name: '降水量',
                    type: 'bar',
                    data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
                    markPoint: {
                        data: [
                            {name: '年最高', value: 182.2, xAxis: 7, yAxis: 183},
                            {name: '年最低', value: 2.3, xAxis: 11, yAxis: 3}
                        ]
                    },
                    markLine: {
                        data: [
                            {type: 'average', name: '平均值'}
                        ]
                    }
                }
            ]
        };
        
        option && myChart2.setOption(option);

        
        var charts = [myChart1,myChart2];
        window.onresize = function(){
            for(var i = 0; i < charts.length; i++){
                charts[i].resize();
            }
        };

        
        </script>
        
        '''
# 万法皆对象
all_js_render = Template(all_js).render(pie_data=pie_data)

# jinja2 渲染模板
temp_out = base_temp.render(all_div=all_div,all_js=all_js_render)


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

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

【注】仅仅对玫瑰图进行了重构,柱状图感兴趣的可以自行重构。

 

 

 

 

 

视图模板

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
		<meta name="keywords"    content="-------------------------ECharts5学习 By 微信 civilpy----------------------------">
		<meta name="description" content="-------------------------ECharts5学习 By 微信 civilpy----------------------------">
        <title>ECharts5学习 By 微信 civilpy</title>
        <link rel="stylesheet" type="text/css" href="../echarts5/dist/css/bootstrap.min.css">      
    </head>
    <body style="background-color: #100C2A ;">
      <section>
        <div class="col-md-12 col-sm-6">
          <h3 class="text-center" style="color:aliceblue">示例预览</h3>
              <!-- 表格DIV-start -->
              {{all_div|safe}}
              <!-- 表格DIV-end -->
        </div><!-- end of chart panel -->
      </section>

      <script src="../echarts5/dist/js/echarts.min.js"></script>
      <script src="../echarts5/dist/js/bootstrap.min.js"></script>
      <!-- 表格js-start -->
      {{all_js|safe}}
      <!-- 表格js-end -->
    </body>
    </html>

【注】小杨,你距离Dashboard又进了一步~

 

 

 

 

结语

本主已经打包了base_flask_tmp.html以及bootstrap、echarts先关css\js文件,对于有基础的道友,从上面代码可以自行构造相关文件;对于小白用户,拿来及运行,可以小支持一下: