Bootstrap

Python flask + Mysql +Echarts :实现数据可视化(玫瑰图)

目录

步骤一:建立Myslq数据库连接

步骤二:开发Flask应用

步骤三:创建前端页面(house_bing.html )

步骤四:运行Flask应用并查看玫瑰图


步骤一:建立Myslq数据库连接

import pymysql

class Mysql(object):
    # 创建 Mysql 类的实例时自动调用
    def __init__(self):
        # 建立MySQL数据库连接
        self.conn = pymysql.connect(host='localhost', user='root', password='123456', database='houses', charset="utf8")
        # 创建了一个游标对象cursor,用于执行SQL命令
        self.cursor = self.conn.cursor()

    # 这个方法使得 Mysql 类的实例可以作为上下文管理器使用
    def __enter__(self):
        return self

    # 负责关闭游标和数据库连接
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cursor.close()
        self.conn.close()

    # 返回的结果是一个元组列表,每个元组代表house_sum表中的一行数据。
    def house(self):
        sql = "select * from house_sum"
        self.cursor.execute(sql)
        return self.cursor.fetchall()

步骤二:开发Flask应用

from flask import Flask, send_from_directory
from flask import render_template
from mysql import Mysql

app = Flask(__name__)

# 将 getdata 函数绑定到根URL路径('/')。这意味着当用户访问服务器的根地址时,将调用 getdata 函数。
@app.route('/')
# 这个函数是处理根URL路径的视图函数
def getdata():
    # 创建了一个 Mysql 类的实例,用于与MySQL数据库建立连接。
    db = Mysql()
    # 调用 db.house() 方法,执行SQL查询并获取结果。
    item = db.house()
    # 将查询结果转换为字典列表,其中每个字典包含 name 和 value 键,分别对应于数据库表中的列。
    data = [{'name': row[0], 'value': row[1]} for row in item]
    # 使用 render_template 函数渲染 house_bing.html 模板,并将转换后的数据作为参数传递给模板。
    return render_template('house_bing.html', data=data)


if __name__ == '__main__':
    app.run(debug=True)    #debug=True发生错误时会返回发生错误的地方

render_template():调用了”render_template()”方法来渲染模板。方法的第一个参数”echarts.html”指向你想渲染的模板名称,第二个参数”data”是你要传到模板去的变量,变量可以传多个。

步骤三:创建前端页面(house_bing.html )

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据可视化</title>
    <script src="{{ url_for('static', filename='echarts.min.js') }}"></script>
    <link rel="stylesheet" href="/static/style.css">
</head>
<body>
<div id="main"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

         //获取数据 将data变量中的数据插入到HTML中。
         // |safe是一个过滤器,它确保插入的数据被正确地转义,以避免XSS攻击。
         var data = {{ data|safe }};
          //调用data数组的map方法创建一个新数组
         var newData = data.map(function(item) {
              return {
              //正则表达式,将item.name中的所有单引号('),替换为空字符串。这里的/g标志表示全局搜索,即替换所有匹配项,而不仅仅是第一个。
                name: item.name.replace(/'/g, ''),
                value: item.value
              };
         });

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '统计每个区(总共16区)房屋总数',
                left:'center',
                textStyle: {
                      fontSize: 25
                },
            },
            //当用户将鼠标悬停在图表的数据项上时,工具提示会显示。
            tooltip: {
               "show": true,
                "trigger": "item", //通过图表中的数据项(item)来触发的
            },
            //配置图表工具箱
            toolbox: {
                show: true,
                //定义了工具箱中包含的功能选项
                feature: {
                mark: { show: true },
                dataView: { show: true, readOnly: false }, //定义了数据视图的功能
                restore: { show: true }, //定义了恢复图表默认状态的功能
                saveAsImage: { show: true }  //定义了将图表保存为图片的功能
                }
            },
            //图例
            legend: {
                orient: 'vertical',
                left: 'left',
                top: '10%'
            },
            //图表系列
            series: [{
                type: 'pie',
                radius: ['40%', '65%'], //饼图的半径
                center: ['50%', '50%'],  //饼图的中心位置
                roseType: "radius", //饼图是否展示成南丁格尔玫瑰图
                avoidOversetting: false,  //控制是否避免标签重叠
                //饼图数据项的样式
                itemStyle: {
                    borderRadius: 18,  //数据项的边框半径为18像素
                    borderWidth: 2  //数据项的边框宽度为2像素
                },
                //定义了当数据项被强调时的样式,比如鼠标悬停时的样式。
                emphasis: {
                    itemStyle: {
                        shadowBlur: 10,  //设置阴影的模糊度为10像素
                        shadowOffsetX: 0,  //设置阴影在水平方向上的偏移量为0像素。
                        shadowColor: 'rgba(0, 0, 0, 0.5)'  //设置阴影的颜色为半透明的黑色。
                    },
                    //标签样式
                    label: {
                        show: true,
                        position: 'inside'  //标签位置在数据项内部
                    },
                },
                data:newData,
                "label": {
                    "show": true,
                    "margin": 10,
                    "formatter": "{b} : {c} ({d}%)" //{b}代表标签的名称,{c}代表数值,{d}%代表百分比
                }
            }]
        };
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>

步骤四:运行Flask应用并查看玫瑰图

运行完,点击 http://127.0.0.1:5000/可以看到html所绘制的玫瑰图

;