Flask+VUE+plotly实现数据可视化

2 篇文章 1 订阅
1 篇文章 0 订阅

前期准备:

前期需先实现Flask+plotly输出图表,可以先查看我的上一篇博客
Flask+plotly实现数据可视化(点击查看)

安装VUE:
准备采用 npm(Nodejs下的包管理器)的方式安装vue,所以第一步安装 node , 官网下载安装即可
安装完成之后在 command prompt 运行 node -v , 便可查看到安装的nodejs 的版本,说明安装成功;

在这里插入图片描述
npm 是集成在node中的,也可以运行: npm -v 查看安装的npm 版本:
在这里插入图片描述
安装cnpm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装vue-cli 脚手架构建工具:
命令行运行npm install -g vue-cli然后等待安装完成
安装成功之后 运行 vue -V 可查看版本,版本出来的话说明安装成功;
在这里插入图片描述

创建VUE项目:

首先通过cd进入项目目录,创建一个vue项目,如下所示

vue init webpack client

? Project name client
? Project description A Vue.js project
? Author hubo <xxxxxxxx@qq.com>
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Airbnb
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm

主要写代码的位置:/flask-vue-crud/client/src/,目录结构如下所示:

在这里插入图片描述
运行该程序:

npm run dev

在这里插入图片描述
访问http://localhost:8080 能看到前端页面

正式开始:

通过axios发送AJAX请求,安装axios,vue-plotly:

cnpm install axios --save
npm install vue-plotly

添加一个新组件
创建client/src/components/Bar.vue:
通过axios从http://192.168.10.163:5000/获取图表的数据,此步中是从已经部署完毕的Flask项目中获取数据,在上一篇文章中有讲解,如果有不懂的可以看看 点击查看,现在的ip换成了ipv4地址,方便内网的同事查看

<template>
<div style="padding: 1em 5em;">
    <div style="margin: 10px auto; width: 70%; height: ;" id="mytable">
      <div id="app">
        <select v-model="aaa" name="fruit">
          <option value="">请选择</option>
          <option value="http://192.168.10.163:5000/scatter">折线图</option>
          <option value="http://192.168.10.163:5000/bar">柱形图</option>
          <option value="http://192.168.10.163:5000/line">线形图</option>
          <option value="http://192.168.10.163:5000/pie">饼图</option>
          <option value="http://192.168.10.163:5000/bubble">泡泡图</option>
          <option value="http://192.168.10.163:5000/dot">点图</option>
          <option value="http://192.168.10.163:5000/filled">区域图</option>
          <option value="http://192.168.10.163:5000/sankey">桑基图</option>
          <option value="http://192.168.10.163:5000/table">表图</option>
          <option value="http://192.168.10.163:5000/sun">太阳图</option>
        </select>
      </div>
        <!--展现可视化图标部分-->
        <Plotly :data="msg" :display-mode-bar="false"></Plotly>
    </div>
</div>
</template>
<script>
import axios from 'axios';
import { Plotly } from 'vue-plotly';

export default {
  components: {
    Plotly,
  },
  name: 'Bar',
  data() {
    return {
      msg: '',
      aaa: '',
      scatter: 'http://192.168.10.163:5000/scatter',
      bar: 'http://192.168.10.163:5000/bar',
    };
  },
  watch: {
    aaa: {
      handler: function refresh() {
        const path = this.aaa;
        axios.get(path)
          .then((res) => {
            this.msg = res.data;
          })
          .catch((error) => {
            console.error(error);
          });
      },
    },
  },
  methods: {
    getMessage() {
      const path = 'http://192.168.10.163:5000/scatter';
      axios.get(path)
        .then((res) => {
          this.msg = res.data;
        })
        .catch((error) => {
          console.error(error);
        });
    },
  },
  created() {
    this.getMessage();
  },
};
</script>

上面Bar.vue中添加了watch监听option的变化,从而从后端获取对应的图形数据。

再添加一个新组件,并把Bar导入,模拟Bar为功能组件,此时新建的Test.vue组件为前端组件。

<template>
  <div id="vue_det">
      <bar></bar>
    <router-view/>
  </div>
</template>

<script>
import Bar from '@/components/Bar';

export default{
  components: {
    Bar,
  },
  data() {
    return {// 这里不要忘记return
      // 这里可以定义初始的变量
    };
  },
  created() {
    // 当我们的组件加载完成时,需要执行的内容.created是vuejs中的钩子函数之一
    this.getData(); // 函数的调用
  },
  methods: {// 定义函数的地方
    getData() {
      // console.log(r);
    }, // 可以定义多个函数
  },
};
</script>

<style>
</style>

更新client/src/router/index.js

import Vue from 'vue';
import Router from 'vue-router';
import HelloWorld from '@/components/HelloWorld';
import Bar from '@/components/Bar';
import Test from '@/components/Test';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld,
    },
    {
      path: '/bar',
      name: 'Bar',
      component: Bar,
    },
    {
      path: '/test',
      name: 'Test',
      component: Test,
    },
  ],
  mode: 'history',
});


上面的mode: 'history’是为了让 URL 变成http://localhost:8080/Test的形式。如果,不加该设置,默认的 URL 为http://localhost:8080/#/Test的形式。

访问http://localhost:8080/Test能看到图表
在这里插入图片描述

在这里插入图片描述

补充:

相对上一篇的Flask中代码有些许变动,整体上是做了模块化,增加了生成图形数据的函数,具体直接上代码
app.py

from flask import Flask
from flask_cors import CORS
from flask import Flask, render_template
from models import create_bar
app = Flask(__name__)
CORS(app)

@app.route('/scatter', methods=['GET'])
def scatter():
	data = create_bar.create_scatter()
	return data

@app.route('/line')
def line():
	data = create_bar.create_line()
	return data

@app.route('/bar')
def bar():
	data = create_bar.create_bar()
	return data

@app.route('/pie')
def pie():
	data = create_bar.create_pie()
	return data

@app.route('/bubble')
def bubble():
	data = create_bar.create_bubble()
	return data

@app.route('/dot')
def dot():
	data = create_bar.create_dot()
	return data

@app.route('/filled')
def filled():
	data = create_bar.create_filled()
	return data

@app.route('/sankey')
def sankey():
	data = create_bar.create_sankey()
	return data

@app.route('/table')
def table():
	data = create_bar.create_table()
	return data

@app.route('/sun')
def sun():
	data = create_bar.create_sun()
	return data

if __name__ == '__main__':
    app.run(
    	host='0.0.0.0',
    	port='5000',
    	debug=True)

create_bar.py

import plotly as py
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
import json

def create_line():
	df = px.data.gapminder().query("continent=='Oceania'")
	fig = px.line(df, x="year", y="lifeExp", color='country')
	jsfig=fig.to_json()
	return jsfig

def create_scatter():
	data1 = {
		'x':[1,2,3,4],
		'y':[16,5,11,9],
		'type':'scatter'
	}
	data2 = {
		'x':[1,2,3,4],
		'y':[10,15,13,17],
		'type':'scatter'
	}
	data =[data1,data2]
	layout = go.Layout(
		title='折线图可视化作图',
	)
	fig = go.Figure(data=data, layout=layout)
	jsfig=fig.to_json()
	return jsfig

def create_bar():
	animals=['giraffes', 'orangutans', 'monkeys']
	fig = go.Figure(
		data=[
    		go.Bar(name='SF Zoo', x=animals, y=[20, 14, 23]),
    		go.Bar(name='LA Zoo', x=animals, y=[12, 18, 29])
		],
		layout=go.Layout(
			title='柱形图可视化作图',
			)
	)
	# Change the bar mode
	fig.update_layout(barmode='group')
	jsfig=fig.to_json()
	return jsfig

def create_pie():
	df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
	df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries' # Represent only large countries
	fig = px.pie(df, values='pop', names='country', title='欧洲各国人口占比')
	jsfig=fig.to_json()
	return jsfig

def create_bubble():
	df = px.data.gapminder()
	fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",
	         size="pop", color="continent",
                 hover_name="country", log_x=True, size_max=60)
	jsfig=fig.to_json()
	return jsfig

def create_dot():
	schools = ["Brown", "NYU", "Notre Dame", "Cornell", "Tufts", "Yale",
           "Dartmouth", "Chicago", "Columbia", "Duke", "Georgetown",
           "Princeton", "U.Penn", "Stanford", "MIT", "Harvard"]
	n_schools = len(schools)

	men_salary = [72, 67, 73, 80, 76, 79, 84, 78, 86, 93, 94, 90, 92, 96, 94, 112]
	women_salary = [92, 94, 100, 107, 112, 114, 114, 118, 119, 124, 131, 137, 141, 151, 152, 165]

	df = pd.DataFrame(dict(school=schools*2, salary=men_salary + women_salary,
                       gender=["Men"]*n_schools + ["Women"]*n_schools))

	# Use column names of df for the different parameters x, y, color, ...
	fig = px.scatter(df, x="salary", y="school", color="gender",
                 title="性别收入差距",
                 labels={"salary":"Annual Salary (in thousands)"} # customize axis label
                )
	jsfig=fig.to_json()
	return jsfig

def create_filled():
	df = px.data.gapminder()
	fig = px.area(df, x="year", y="pop", color="continent",
	      line_group="country")
	jsfig=fig.to_json()
	return jsfig

def create_sankey():
	fig = go.Figure(go.Sankey(
    arrangement = "snap",
    node = {
        "label": ["A", "B", "C", "D", "E", "F"],
        "x": [0.2, 0.1, 0.5, 0.7, 0.3, 0.5],
        "y": [0.7, 0.5, 0.2, 0.4, 0.2, 0.3],
        'pad':10},  # 10 Pixels
    link = {
        "source": [0, 0, 1, 2, 5, 4, 3, 5],
        "target": [5, 3, 4, 3, 0, 2, 2, 3],
        "value": [1, 2, 1, 1, 1, 1, 1, 2]}))
	jsfig=fig.to_json()
	return jsfig

def create_table():
	fig = go.Figure(data=[go.Table(
    header=dict(values=['A Scores', 'B Scores'],
                line_color='darkslategray',
                fill_color='lightskyblue',
                align='left'),
    cells=dict(values=[[100, 90, 80, 90], # 1st column
                       [95, 85, 75, 95]], # 2nd column
               line_color='darkslategray',
               fill_color='lightcyan',
               align='left'))
	])
	jsfig=fig.to_json()
	return jsfig

def create_sun():
	data = dict(
    character=["Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"],
    parent=["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve" ],
    value=[10, 14, 12, 10, 2, 6, 6, 4, 4])

	fig =px.sunburst(
	    data,
	    names='character',
	    parents='parent',
	    values='value',
	)
	jsfig=fig.to_json()
	return jsfig
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Flask和MySQL来实现数据可视化,可以通过以下步骤来实现: 1. 使用Flask来搭建Web应用程序,根据需要设置路由和视图函数。 2. 使用MySQL数据库来存储数据,建立需要的数据表,并通过Flask的SQLAlchemy库进行数据库交互。 3. 使用Echarts库来实现数据可视化,通过Flask的路由将需要展示的数据传递给前端页面,并将数据绑定到Echarts图形中进行展示。 通过上述步骤,就可以实现Flask+MySQL+Echarts的数据可视化。 ### 回答2: Flask是一个用Python编写的轻量级Web应用框架;MySQL是一种关系型数据库;而Echarts是一个由百度公司开发的数据可视化库。将Flask、MySQL和Echarts组合使用,可以实现数据的可视化展示,使数据更具可读性和可理解性。 实现步骤如下: 1.搭建Flask框架,建立路由,用于数据传输。 2.连接MySQL数据库,使用Python的pymysql模块连接数据库。 3.从MySQL数据库中读取所需的数据,并将它们存入Python中的数据结构中,如字典或列表,然后将其传回到Flask应用中。 4.编写Echarts图表,并将数据插到其中。可以选择线形图、条形图、饼图、地图等不同的图表类型,并根据需求自定义颜色、字体、动画效果等。 5.最后将Echarts图表嵌入到Flask应用中,使其显示在网页上,供用户查看并互动。 对于使用Flask、MySQL和Echarts实现数据可视化的具体步骤,我将稍微详细说明一下。 一、搭建Flask框架 Flask是一个微型框架,采用了Werkzeug工具箱和Jinja2模板引擎。我们需要安装Flask和相关的依赖项,建立Flask应用程序,然后建立路由,使得我们可以传输数据到和从Flask应用程序中。 二、连接MySQL数据库 我们可以使用比Python标准库中的MySQLdb更流行的pymysql模块来连接我们的MySQL数据库。我们需要提供数据库的用户名和密码,以及主机名、端口、要使用的数据库等其他相关信息。连接后,可以通过Python执行SQL查询或更新,以读取或写入数据。 三、读取数据并传回Flask应用程序: 使用Python代码向数据库查询所需数据,从结果中提取所需信息,然后返回组成数据结构,如列表或字典。在Flask应用程序中设置一个路由,可以识别来自前端JavaScript的HTTP GET请求,并将响应作为JSON格式数据发送回前端。 四、编写Echarts图表 我们可以使用Echarts图表库中的各种类型的图表,用于不同的数据可视化需求。我们可以选择线形图、条形图、散点图、饼图、地图等。Echarts提供了一个函数接口,可以直接把数据传入图表,然后用JavaScript来呈现。 五、将Echarts图表嵌入到Flask应用中 将Echarts图表嵌入到Flask应用程序中,需要在前端JavaScript中调用我们已设置好的路由,向Flask应用程序请求数据,并在响应到达时调用Echarts图表组件来显示数据。    综上所述,使用Flask、MySQL和Echarts结合实现数据可视化,可以让数据更生动形象,让用户对数据有更好的理解和掌握,进而提升整个数据应用的效率和可靠性。 ### 回答3: Flask是一个非常流行的Python Web框架,可以用来搭建Web应用程序。MySQL是一个开源、轻量级的关系型数据库管理系统。而echarts是一个非常强大的JavaScript图表库,可以用来展示各种数据。 通过将这三者结合起来,可以实现数据可视化,即将MySQL中的数据通过Flask进行处理和展示,并使用echarts将这些数据以图表的方式呈现出来。 实现该过程的基本步骤如下: 1.使用Python连接MySQL数据库并读取数据。 2.使用Flask框架编写Web应用程序,包括提供数据的API接口、前端页面等。 3.在前端页面中使用echarts库进行数据可视化展示。可以绘制多种类型的图表,如折线图、柱状图、饼图等,根据数据的具体情况选择合适的图表类型。 具体实现步骤如下: 1.安装MySQL和Flask库,分别使用以下命令: pip install mysql-connector-python pip install Flask 2.编写Python代码,连接MySQL数据库,并读取需要展示的数据。代码示例: import mysql.connector cnx = mysql.connector.connect(user='用户名', password='密码', host='主机名', database='数据库名') cursor = cnx.cursor() query = "SELECT * FROM 表名" cursor.execute(query) data = cursor.fetchall() 3.编写Flask应用程序,提供API接口。代码示例: from flask import Flask, jsonify app = Flask(__name__) @app.route("/data") def get_data(): # 数据读取及处理 return jsonify(data) if __name__ == "__main__": app.run() 4.编写前端页面,使用echarts库进行数据可视化展示。代码示例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>数据可视化展示</title> </head> <body> <!--echarts图表展示区域--> <div id="chart" style="width: 600px; height:400px;"></div> <!--echarts库的引入--> <script src="https://cdn.staticfile.org/echarts/4.2.0-rc.1/echarts.min.js"></script> <!--数据获取及图表绘制--> <script> var dataUrl = "/data"; $.get(dataUrl, function (data) { var chart = echarts.init(document.getElementById('chart')); var option = { xAxis: { type: 'category', data: data.xAxisData }, yAxis: { type: 'value' }, series: [{ data: data.seriesData, type: 'bar' }] }; chart.setOption(option); }); </script> </body> </html> 以上就是Flask MySQL echarts实现数据可视化的基本步骤,通过这种方式可以方便地展示各种类型的数据。在实际项目中,还需要根据具体情况进行相应的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值