我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flask框架利用Echarts实现绘制图形

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flask框架利用Echarts实现绘制图形

echarts是百度推出的一款开源的基于JavaScript的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,Echarts绘图库同样可以与Flask结合,前台使用echart绘图库进行图形的生成与展示,后台则是Flask通过render_template方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态展示Web服务日志状态功能。

如下演示案例中,将分别展示运用该绘图库如何前后端交互绘制(饼状图,柱状图,折线图)这三种最基本的图形。

实现绘制饼状图

用于模拟统计Web容器的日志数据,通过饼状图将访问状态统计出来。

前端部分/templates/index.html代码如下:

<html>
	<head>
		<meta charset="UTF-8">
		<title>LyShark</title>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/echarts/5.0.0/echarts.min.js"></script>
	</head>

	<body>
		<div class="panel panel-primary" style="width: 40%;height: 30%; float: left">
		<div class="panel-heading">
			<h3 class="panel-title">LyShark 网站访问状态统计</h3>
		</div>
		<div class="panel-body">
			<div id="main" style="width:100%; height: 300px"></div>
		</div>
		</div>
	</body>

	<script type="text/javascript" charset="UTF-8">
		var kv = new Array();
		kv = {{ data | safe }}
		var test = new Array();
		for(var logkey in kv){
			test.push( {value:kv[logkey], name:logkey} )
		}
		var display = function(){
			var main = echarts.init(document.getElementById("main"));
			var option = {
				legend: {
					orient: 'vertical',
					left: 'left',
				},
				series: [
					{
						type: 'pie',
						radius: '70%',
						center: ['50%', '50%'],
						detail: {formatter:'{value}'},
						data: test
					}
				]
			};
			main.setOption(option,true);
		};
		display();
	</script>
</html>

后端代码如下通过模拟render_template返回一些数据。

from flask import Flask,render_template,request
import json

app = Flask(import_name=__name__,
            static_url_path='/python',   # 配置静态文件的访问url前缀
            static_folder='static',      # 配置静态文件的文件夹
            template_folder='templates') # 配置模板文件的文件夹

def Count_Flag_And_Flow(file):
    list = []
    flag = {}
    with open(file) as f:
        contexts = f.readlines()
    for line in contexts:
        it = line.split()[8]
        list.append(it)
    list_num = set(list)
    for item in list_num:
        num = list.count(item)
        flag[item] = num
    return flag

@app.route('/', methods=["GET"])
def index():
    Address = {'226': 4, '404': 12, '200': 159, '400': 25, '102': 117, '302': 1625}
    # Address = Count_Flag_And_Flow("d://access_log")
    return render_template("index.html",data = json.dumps(Address))

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=80, debug=False)

运行后访问自定义域名,输出如下效果的饼状图:

实现绘制柱状图

统计访问了本站的所有ID地址并将地址数大于2的全部显示出来.

前端index.html代码如下

<html>
	<head>
		<meta charset="UTF-8">
		<title>LyShark</title>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/echarts/5.0.0/echarts.min.js"></script>
	</head>

	<body>
		<div class="panel panel-primary" style="width: 58%;height: 30%; float: left">
			<div class="panel-heading">
				<h3 class="panel-title">LyShark 网站设备类型统计</h3>
			</div>
			<div class="panel-body">
				<div id="main1" style="width:100%; height: 300px"></div>
			</div>
		</div>
	</body>

	<script type="text/javascript" charset="UTF-8">
			var kv = new Array();
			var keys = new Array();
			var values = new Array();
			kv = {{ data | safe }}

			for(var logkey in kv){
				keys.push(logkey);
				values.push(kv[logkey]);
			}
			var display = function() {
				var main1 = echarts.init(document.getElementById("main1"));
				var option = {
					xAxis: {
						type: 'category',
						data: keys
					},
					yAxis: {
						type: 'value'
					},
					series: [{
						data: values,
						type: 'bar'
					}]
				};
				main1.setOption(option,true);
			};
		display();
	</script>
</html>

后端代码如下,路由曾则只保留一个index映射

from flask import Flask,render_template,request
import json

app = Flask(import_name=__name__,
            static_url_path='/python',   # 配置静态文件的访问url前缀
            static_folder='static',      # 配置静态文件的文件夹
            template_folder='templates') # 配置模板文件的文件夹

def Count_Flag_And_Type(file):
    list = []
    flag = {}
    with open(file) as f:
        contexts = f.readlines()
    for line in contexts:
        addr = line.split()[0].replace("(","").replace(")","")
        if addr != "::1":
            list.append(addr)

    # 去重并将其转为字典
    list_num = set(list)
    for item in list_num:
        num = list.count(item)
        # 如果地址只有一次则忽略
        if num > 1:
            flag[item] = num
    return flag

@app.route('/', methods=["GET"])
def index():
    Types = {'Linux': 23, 'studies': 57, 'Windows': 87, 'compatible': 44, 'web': 32, 'X11': 78}
    # Types = Count_Flag_And_Type("d://access_log")
    return render_template("index.html",data = json.dumps(Types))

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=80, debug=False)

柱状图绘制效果如下:

实现绘制折线图

统计指定的时间段内的访问流量数据.

前端index.html代码如下

<html>
	<head>
		<meta charset="UTF-8">
		<title>LyShark</title>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
		<script class="lazy" data-src="https://cdn.lyshark.com/javascript/echarts/5.0.0/echarts.min.js"></script>
	</head>

	<body>
		<div class="panel panel-primary" style="width: 100%;height: 30%; float: left">
			<div class="panel-heading">
				<h3 class="panel-title">LyShark 网站流量统计</h3>
			</div>
			<div class="panel-body">
				<div id="main" style="width:100%; height: 400px"></div>
			</div>
		</div>
	</body>

	<script type="text/javascript" charset="UTF-8">
			var kv = new Array();
			var keys = new Array();
			var values = new Array();
			kv = {{ data | safe }};
			for(var logkey in kv){
				keys.push(logkey);
				values.push(kv[logkey]);
			}

			var display = function() {
				var main = echarts.init(document.getElementById("main"));
				var option = {
					xAxis: {
						type: 'category',
						boundaryGap: false,
						data: keys
					},
					yAxis: {
						type: 'value'
					},
					series: [{
						data: values,
						type: 'line',
						areaStyle: {},
					}]
				};
				main.setOption(option,true);
			};
		display();
	</script>
</html>

后端代码如下,路由曾则只保留一个index映射

from flask import Flask,render_template,request
import json

app = Flask(import_name=__name__,
            static_url_path='/python',   # 配置静态文件的访问url前缀
            static_folder='static',      # 配置静态文件的文件夹
            template_folder='templates') # 配置模板文件的文件夹

def Count_Time_And_Flow(file):
    times = {}  # key 保存当前时间信息
    flow = {}   # value 当前时间流量总和
    Count= 0    # 针对IP地址的计数器
    with open(file) as f:
        contexts = f.readlines()
    for line in contexts:
        if line.split()[9] != "-" and line.split()[9] != '"-"':
            size = line.split()[9]
        temp = line.split()[3]
        ip_attr = temp.split(":")[1] + ":" + temp.split(":")[2]
        Count = int(size) + Count
        if ip_attr in times.keys():
            flow[ip_attr] = flow[ip_attr] + int(size)
        else:
            times[ip_attr] = 1
            flow[ip_attr] = int(size)
    return flow

@app.route('/', methods=["GET"])
def index():
    OutFlow = {'03:30': 12, '03:48': 25, '04:15': 47, '04:28': 89, '04:42': 66, '04:51': 54}
    # OutFlow = Count_Time_And_Flow("d://access_log")
    return render_template("index.html",data = json.dumps(OutFlow))

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=80, debug=False)

折现图绘制效果如下:

如上是三种常用图形的绘制方式,其他图形同理可以参考如上方代码中的写法,我们可以将这三个图形合并在一起,主要是前端对其进行排版即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.lyshark.com/javascript/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" >
    <script type="text/javascript" class="lazy" data-src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" class="lazy" data-src="https://cdn.lyshark.com/javascript/echarts/5.0.0/echarts.min.js"></script>
</head>
<body>

    <!--饼状图绘制方法-->
    <div class="panel panel-primary" style="width: 40%;height: 30%;float: left">
        <div class="panel-heading">
            <h3 class="panel-title">饼状图绘制</h3>
        </div>
        <div class="panel-body">
            <div id="PieChart" style="width:100%; height: 300px"></div>
        </div>
    </div>

    <!--柱状图绘制方法-->
    <div class="panel panel-primary" style="width: 58%;height: 30%; float: right">
        <div class="panel-heading">
            <h3 class="panel-title">柱状图绘制</h3>
        </div>
        <div class="panel-body">
            <div id="HistogramChart" style="width:100%; height: 300px"></div>
        </div>
    </div>

    <!--折线图绘制方法-->
    <div class="panel panel-primary" style="width: 100%;height: 40%; float: left">
        <div class="panel-heading">
            <h3 class="panel-title">折线图绘制</h3>
        </div>
        <div class="panel-body">
            <div id="Linechart" style="width:100%; height: 460px"></div>
        </div>
    </div>

    <!--饼状图绘制方法-->
    <script type="text/javascript" charset="UTF-8">
        var kv = new Array();
        kv = {{ Address | safe }}
        var test = new Array();
        for(var logkey in kv){
            test.push( {value:kv[logkey], name:logkey} )
        }
        var display = function(){
            var echo = echarts.init(document.getElementById("PieChart"));
            var option = {
                legend: {
                    orient: 'vertical',
                    left: 'left',
                },
                series: [
                    {
                        type: 'pie',
                        radius: '70%',
                        center: ['50%', '50%'],
                        detail: {formatter:'{value}'},
                        data: test
                    }
                ]
            };
            echo.setOption(option,true);
        };
        display();
    </script>

    <!--柱状图绘制方法-->
    <script type="text/javascript" charset="UTF-8">
        var kv = new Array();
        var keys = new Array();
        var values = new Array();
        kv = {{ Types | safe }}

        for(var logkey in kv){
            keys.push(logkey);
            values.push(kv[logkey]);
        }
        var display = function() {
            var echo = echarts.init(document.getElementById("HistogramChart"));
            var option = {
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                      type: 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: {
                    type: 'category',
                    data: keys
                },
                yAxis: {
                    type: 'value'
                },
                series: [{
                    data: values,
                    type: 'bar'
                }]
            };
            echo.setOption(option,true);
        };
        display();
    </script>

    <!--折线图绘制方法-->
    <script type="text/javascript" charset="UTF-8">

        // 函数主要用于将传入的字典分解成key,value格式并返回
        var get_key_value = function(kv)
        {
            var keys = new Array();
            var values = new Array();

            for(var logkey in kv)
            {
                keys.push(logkey);
                values.push(kv[logkey]);
            }
            return [keys,values];
        }

        // 输出1分钟负载
        var kv = new Array();
        kv = {{ x | safe }};
        var x = get_key_value(kv);

        // 输出5分钟负载
        var kv = new Array();
        kv = {{ y | safe }};
        var y = get_key_value(kv);

        // 输出15分钟负载
        var kv = new Array();
        kv = {{ z | safe }};
        var z = get_key_value(kv);

        // 显示利用率
        var display = function() {
            var echo = echarts.init(document.getElementById("Linechart"));
            var option = {
                title: {
                    left: 'left',
                    text: 'CPU 利用表',
                },
                // 调节大小
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                // tooltip 鼠标放上去之后会自动出现坐标
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross',
                        label: {
                            backgroundColor: '#6a7985'
                        }
                    }
                },
            legend: {
                data: ['1分钟负载', '5分钟负载', '15分钟负载']
            },

            xAxis: {
                type: 'category',
                // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                data: x[0]
            },
            yAxis: {
                type: 'value'
            },
            series:
            [
                {
                    name: "1分钟负载",
                    stack: "总量",
                    //data: [10, 25, 99, 87, 54, 66, 2],
                    data: x[1],
                    type: 'line'
                },
                {
                    name: "5分钟负载",
                    stack: "总量",
                    //data: [89, 57, 85, 44, 25, 4, 54],
                    data: y[1],
                    type: 'line'
                },
                {
                    name: "15分钟负载",
                    stack: "总量",
                    //data: [1, 43, 2, 12, 5, 4, 7],
                    data: z[1],
                    type: 'line'
                }
            ]
            };
            echo.setOption(option,true);
        };
        display();
    </script>
</body>

后端代码如下,其中的参数可以从数据库内提取也可以从文件中读入。

from flask import Flask,render_template,request
import json

app = Flask(import_name=__name__,
            static_url_path='/python',   # 配置静态文件的访问url前缀
            static_folder='static',      # 配置静态文件的文件夹
            template_folder='templates') # 配置模板文件的文件夹

@app.route('/', methods=["GET"])
def index():
    Address = {'226': 4, '404': 12, '200': 159, '400': 25, '102': 117, '302': 1625}
    Types = {'Linux': 23, 'studies': 57, 'Windows': 87, 'compatible': 44, 'web': 32, 'X11': 78}
    x = {'03:30': 12, '03:48': 25, '04:15': 47, '04:28': 89, '04:42': 66, '04:51': 54}
    y = {'05:22': 55, '07:48': 29, '07:15': 98, '08:54': 11, '08:41': 61, '06:51': 5}
    z = {'07:30': 1, '09:48': 5, '06:15': 24, '08:28': 59, '2:42': 11, '08:51': 22}
    
    return render_template("index.html",Address = json.dumps(Address), Types= json.dumps(Types), x = json.dumps(x), y = json.dumps(y), z = json.dumps(z))

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=80, debug=False)

输出效果如下:

到此这篇关于Flask框架利用Echarts实现绘制图形的文章就介绍到这了,更多相关Flask Echarts绘制图形内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flask框架利用Echarts实现绘制图形

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flask框架运用Ajax实现轮询动态绘图

Ajax是异步JavaScript和XML可用于前后端交互,本文将通过Ajax轮询获取后端的数据,前台使用echart绘图库进行图形的生成与展示,最后实现动态监控内存利用率的这个功能,需要的可以参考一下
2022-11-13

怎么利用js读取excel文件并绘制echarts图形

这篇“怎么利用js读取excel文件并绘制echarts图形”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么利用js读取e
2023-06-30

怎么使用Vue+Echarts实现绘制动态折线图

今天小编给大家分享一下怎么使用Vue+Echarts实现绘制动态折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 引入
2023-07-05

怎么使用Vue+Echarts实现基本K线图的绘制

本篇内容介绍了“怎么使用Vue+Echarts实现基本K线图的绘制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 引入Echarts1.1
2023-07-05

PythonFlask利用SocketIO库实现图表的绘制

这篇文章主要为大家详细介绍了PythonFlask框架如何利用SocketIO库实现图表的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-22

利用Matplotlib实现单画布绘制多个子图

这篇文章主要介绍了利用Matplotlib实现单画布绘制多个子图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-07

利用Python实现绘制论文中的曲线图

这篇文章主要为大家详细介绍了如何利用Python语言实现绘制论文中需要的曲线图,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-03-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录