Echarts5.3.2可视化案例-交互篇(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Echarts5.3.2可视化案例-交互篇Echarts简介官网介绍Echarts案例Echarts 前后端交互

Echarts简介

官网介绍

1.官网地址:

https://echarts.apache.org/en/index.html

https://echarts.apache.org/zh/index.html

2.介绍下官网:


看文档

知道如何下载

通过github下载

在dist目录下 echarts.js

示例 https://echarts.apache.org/examples/zh/index.html

gallery资源 https://www.makeapie.com/explore.html#s

Echarts案例

https://echarts.apache.org/zh/tutorial.html


1.下载echarts.js到本地

2.然后在html文件中通过如下引入

<script src="echarts.min.js"></script>

或通过cdn免下载引入

<script src="https://cdn.jsdelivr.net/npm/echarts@5.3.2/dist/echarts.js"></script>

3.使用

初始化一个具有宽和高的容器

<div id="main" style="width: 600px ;height:600px;"></div>

在script中进行如下操作

初始化e’charts,绑定容器

<script>
        // init echarts
        var myid = document.getElementById("main");
        var myecharts = echarts.init(myid);
        // define option
        // invoking function
    </script>

设置option,这里包括我们想要绘制的图形类型,数据,x,y轴信息等

在官网示例中找

        // define option
        var option = {
            title:{
                text:"echarts 标题"
            },
            xAxis:{
                data:['food','digital','dress','bags']
            },
            yAxis:{
            },
            series:{
                type:"bar",
                data:[100,120,90,150]
            },
        }

将option传给myecharts实例就可以了

        //Call the function and pass the arguments
        myecharts.setOption(option);

展示如图



Echarts 前后端交互

1. 安装flask

pip install flask==2.0.3

2. 创建appweb.py

并初始化appweb.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'
@app.route('/hello')
def hello():
    return 'Hello2'
# app.run(host, port, debug, options)
app.run("0.0.0.0",5000,debug=True,)

必须在项目中导入Flask模块。 Flask类的一个对象是我们的WSGI应用程序。

Flask构造函数使用当前模块(__name __)的名称作为参数。

Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。


测试

http://localhost:5000/hello

http://localhost:5000/hello

3. flask返回json数据+中文显示

app.config['JSON_AS_ASCII'] = False
# 随便定义个json字典
dic={"a":1,"b":2,"c":"你好"}
@app.route('/jsonify')
def jsonifys():
    # Content-Type: application/json
    return jsonify(dic)
@app.route('/jsondumps')
def jsondumps():
    # Content-Type: text/html; charset=utf-8
    return json.dumps(dic,ensure_ascii=False)

测试:

http://localhost:5000/jsonify

http://localhost:5000/jsondumps


使用jsonify方法是需要添加一句 app.config[‘JSON_AS_ASCII’] = False

而json.dumps方法需要添加参数 ensure_ascii=False

这样做可以避免显示中文乱码。

4. flask读取数据库返回json数据

SQL文件:

/*
 Navicat Premium Data Transfer
 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50723
 Source Host           : localhost:3306
 Source Schema         : weblogs
 Target Server Type    : MySQL
 Target Server Version : 50723
 File Encoding         : 65001
 Date: 14/04/2022 12:54:40
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for dw_pvs_everyhour_oneday
-- ----------------------------
DROP TABLE IF EXISTS `dw_pvs_everyhour_oneday`;
CREATE TABLE `dw_pvs_everyhour_oneday`  (
  `month` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '月份',
  `day` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '日期',
  `hour` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '小时',
  `pvs` int(11) NULL DEFAULT NULL COMMENT '每天浏览量'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dw_pvs_everyhour_oneday
-- ----------------------------
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 07', 13);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 08', 11);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 09', 14);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 10', 3);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 11', 2);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 12', 4);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 13', 5);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 14', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 15', 2);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 16', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 17', 4);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 19', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 22', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '18', ' 23', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '19', ' 00', 4);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '19', ' 02', 2);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '19', ' 03', 5);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '19', ' 04', 1);
INSERT INTO `dw_pvs_everyhour_oneday` VALUES ('09', '19', ' 05', 1);

Python web代码:

在工程目录下创建static和templates目录,如下:



在工程目录下创建webapp.py文件,内容如下:

from  flask import Flask,render_template,url_for
import pymysql
import json
#生成Flask实例
app=Flask(__name__)
@app.route("/")
def hello():
   return  render_template('my_template.html')
#/test路由    接收前端的Ajax请求
@app.route('/test',methods=['POST','GET'])
def my_echart():
    #连接数据库
    conn=pymysql.connect(host='127.0.0.1',user='root',password='111111',db='weblogs')
    cur=conn.cursor()
    sql='SELECT t.hour,t.pvs from dw_pvs_everyhour_oneday t'
    cur.execute(sql)
    u=cur.fetchall()
    #转换成json格式
    jsonData={}
    xhour=[]
    ypvs=[]
    for data in u:
        xhour.append(data[0])
        ypvs.append(data[1])
    print(xhour)
    print(ypvs)
    jsonData['xdays']=xhour
    jsonData['yvalues']=ypvs
    #json.dumps()用于将dict类型的数据转换成str,因为如果直接将dict类型的数据写入json会报错,因此将数据写入时需要用到此函数
    j=json.dumps(jsonData)
    cur.close()
    conn.close()
    #在浏览器上渲染my_template.html模板(为了查看输出数据)
    return (j)
if __name__ == '__main__':
    app.run(debug=True)

测试:

http://localhost:5000/test

在templates文件夹下创建my_template.html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>炫酷的ECharts</title>
</head>
 <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 800px;height:500px;margin: 0 auto;"></div>
<!--引入jquery.js-->
<script src="../static/js/jquery.js"></script>
<!--引入echarts.js-->
<script src="../static/js/echarts.js"></script>
<script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));
    var app = {
        xday:[],
        yvalue:[]
    };
    // 发送ajax请求,从后台获取json数据
    $(document).ready(function () {
       getData();
       console.log(app.xday);
       console.log(app.yvalue)
    });
    function getData() {
         $.ajax({
            url:'http://localhost:5000/test',
            data:{},
            type:'GET',
            async:false,
            dataType:'json',
            success:function(data) {
                app.xday = data.xdays;
                app.yvalue = data.yvalues;
                myChart.setOption({
                    title: {
                        text: '异步数据加载示例'
                    },
                    tooltip: {},
                    legend: {
                        data:['销量']
                    },
                    xAxis: {
                        data: app.xday
                    },
                    yAxis: {},
                    series: [{
                        name: '销量',
                        type: 'bar',
                        data: app.yvalue
                    }]
                })
            },
            error:function (msg) {
                console.log(msg);
                alert('系统发生错误');
            }
        })
    };
</script>
<body>
</body>
</html>

测试:

打开http://localhost:5000/

返回截图如下:



5. flask返回pandas读取的数据

数据样例:



后端代码:

import pandas as pd
df = pd.read_csv("DataAnalyst.csv")
@app.route('/detail')
def get_detail():
    # 省略df的创建过程
    jdata = df.to_json(orient='records', force_ascii=False)
    # 返回值为一个字符串
    return jdata
@app.route('/detailjson')
def get_detail_json():
    # 省略df的创建过程
    jdata = df.to_json(orient='records', force_ascii=False)
    # 返回值为json数据
    return jsonify(json.loads(jdata))

前端代码:

<div id="main2" style="width: 800px;height:500px;margin: 0 auto;"></div>
<script type="text/javascript">
    var myChart2 = echarts.init(document.getElementById('main2'));
    var app2 = {
        xday:[],
        yvalue:[]
    };
    // 发送ajax请求,从后台获取json数据
    $(document).ready(function () {
       getData();
       console.log(app.xday);
       console.log(app.yvalue);
       getDfData();
    });
    var city_list = [];
    var city_company_list = [];
    var dict1 = {};
    function getDfData() {
         $.ajax({
            //url:'http://localhost:5000/detail',
            url:'http://localhost:5000/detailjson',
            data:{},
            type:'GET',
            async:false,
            dataType:'json',
            success:function(data) {
                data.forEach((item, index) => {
                    if (dict1.hasOwnProperty(item.城市)) {
                        dict1[item.城市] += 1;
                        } else {
                        dict1[item.城市] = 1;
                        }
                });
                for(var key in dict1){
                    city_list.push(key)
                    city_company_list.push(dict1[key])
                }
                app2.xday = city_list;
                app2.yvalue = city_company_list;
                console.log(app2)
                myChart2.setOption({
                    title: {
                        text: '异步数据加载示例'
                    },
                    tooltip: {},
                    legend: {
                        data:['销量']
                    },
                    xAxis: {
                        data: app2.xday
                    },
                    yAxis: {},
                    series: [{
                        name: '销量',
                        type: 'bar',
                        data: app2.yvalue
                    }]
                })
            },
            error:function (msg) {
                console.log(msg);
                alert('系统发生错误');
            }
        })
    };
</script> 

6. flask解决CORS跨域问题

如果前端代码不在flask工程下,或是直接打开html,会出现无法前端无法获得数据的情况,这时可以配置跨域请求

什么是跨域?


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
数据可视化 前端开发 JavaScript
Echarts+JS实现农业指挥舱可视化大屏!!附源码!!
Echarts+JS实现农业指挥舱可视化大屏!!附源码!!
|
30天前
|
数据可视化 大数据
【Echarts大屏】大数据平台可视化大屏
【Echarts大屏】大数据平台可视化大屏
【Echarts大屏】大数据平台可视化大屏
|
29天前
|
数据可视化 前端开发 JavaScript
【Echarts大屏】智慧医疗可视化大屏(新手必用)
【Echarts大屏】智慧医疗可视化大屏(新手必用)
|
29天前
|
数据可视化 前端开发 JavaScript
Echarts+JS实现数据分析可视化大屏!!附源码!!
Echarts+JS实现数据分析可视化大屏!!附源码!!
|
30天前
|
数据可视化
【Echarts大屏】智慧门店可视化大屏
【Echarts大屏】智慧门店可视化大屏
|
30天前
|
数据可视化 前端开发 JavaScript
Echarts英雄联盟可视化大屏(记得收藏)
Echarts英雄联盟可视化大屏(记得收藏)
|
30天前
|
数据可视化 前端开发 JavaScript
【Echarts大屏】茶山指挥舱可视化大屏(记得收藏)
【Echarts大屏】茶山指挥舱可视化大屏(记得收藏)
|
30天前
|
数据可视化 前端开发 JavaScript
【Echarts大屏】大客户银行可视化大屏(附源码一键复制)
【Echarts大屏】大客户银行可视化大屏(附源码一键复制)
|
30天前
|
数据可视化 前端开发 JavaScript
【Echarts大屏】智慧图书馆可视化大屏(附源码一键复制)
【Echarts大屏】智慧图书馆可视化大屏(附源码一键复制)
|
30天前
|
数据可视化 前端开发 JavaScript
【Echarts大屏】共享单车运营平台|可视化大屏
【Echarts大屏】共享单车运营平台|可视化大屏