Flask+MySQL+Echarts: 實現(xiàn)數(shù)據(jù)可視化

一、軟件及對應版本

  • Python 3.6.1 |Anaconda custom
  • Flask 0.12.2
  • Echarts 4.0

二、項目目錄

Project directory.jpg

三、代碼展示

  • server.py
from flask import Flask,render_template, url_for
import pymysql
import pandas as pd


app = Flask(__name__)
app.jinja_env.filters['zip'] = zip

def conn_db():
    conn = pymysql.connect(host="your_host", user="your_username", password="your_password", db="your_database", charset="utf8")
    return conn

def get_data(conn=conn_db(), n=10):
    # Get the top10 products
    sql = "select ProductMName, date_format(FeedbackDate, '%Y-%m') Month, count(FeedBack) Count from Feedbacks group by ProductMName, Month order by Count desc, Month asc"
    df = pd.read_sql(sql, conn)
    conn.close()
    product_count = []
    for index, value in enumerate(df["ProductMName"].unique()):
        product_count.append([value, index+1])
    product_count = dict(product_count)
    df["Rank"] = df["ProductMName"].map(lambda x: product_count[x])
    df = df[df["Rank"]<=n][["ProductMName", "Month", "Count"]]
    df.sort_values(by="Month", inplace=True)
    df_TotleCount = df.groupby(["ProductMName"])["Count"].sum()
    df_TotleCount.sort_values(ascending=False, inplace=True)
    df_pivot = pd.pivot_table(df, index="ProductMName", columns="Month", values="Count", fill_value=0)
    return df_TotleCount, df_pivot

@app.route('/')
def display_FeedbackCountByProject():
    df_TotleCount, df_pivot = get_data(n=10)
    TotleCount = df_TotleCount.values
    ProductMName = df_pivot.index.tolist()
    Month = df_pivot.columns.tolist()
    Count = df_pivot.values.tolist()
    return render_template('FeedbackCountByProject.html', ProductMName=ProductMName, Month=Month, Count=Count, TotleCount=TotleCount)

if __name__ == "__main__":
    app.run(debug = True)
  • FeedbackCountByProject.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="{{ url_for('static', filename='echarts.min.js') }}"></script>
    <title></title>
    <style>
        *{
            margin: 0; padding: 0;
        }
    </style>
</head>
<body>
    <div id="top" style="width: 1200px; height: 400px; padding: 20px;"></div>
    <div id="bottom" style="width: 1200px; height: 400px; padding: 20px;"></div>
    <script type="text/javascript">
        var myTop = echarts.init(document.getElementById('top'));
        var myBottom = echarts.init(document.getElementById('bottom'));

        optionTop = {
            title: {
                text: 'Top 10 Project By Date',
                left: 0,
                top: -5,
                subtextStyle: {
                    fontWeight: 'bolder'
                },
            },
            toolbox: {
                show: true,
                right: 80,
                feature: {
                    saveAsImage: {}
                }
            },
            legend: {
                show: true,
                data: ['', '', {% for p in ProductMName %}'{{ p }}', {% endfor %}],
                right: 0
            },
            tooltip: {
                trigger: 'axis'
            },
            grid: {
                bottom: 90
            },
            xAxis: {
                type: 'category',
                boundaryGap: false,
                name: 'Month of FeedbackDate',
                nameLocation: 'center',
                nameGap: 22,
                data: [{% for m in Month %}'{{ m }}', {% endfor %}],
                silent: false,
                splitLine: {
                    show: false
                },
                splitArea: {
                    show: false
                },
                nameTextStyle: {
                    fontWeight: 'bolder'
                }
            },
            yAxis: {
                type: 'value',
                name: 'FeedbackCnt',
                nameLocation: 'center',
                nameGap: 42,
                splitArea: {
                    show: false
                },
                nameTextStyle: {
                    fontWeight: 'bolder'
                }
            },
            series: [
                {% for pr, cnt in ProductMName|zip(Count) %}{
                name: '{{ pr }}',
                type: 'line',
                data: {{ cnt }},
                symbol: 'circle',
                symbolSize: 1
                }, {% endfor %}
            ]
        };

        optionBottom = {
            title: {
                text: 'Top 10 Project By Feedback Count',
                left: 0,
                top: -5,
                subtextStyle: {
                    fontWeight: 'bolder'
                },
            },
            toolbox: {
                show: true,
                feature: {
                    saveAsImage: {}
                }
            },
            legend: {
                show: false
            },
            tooltip: {
                trigger: 'axis'
            },
            grid: {
                bottom: 90
            },
            xAxis: {
                type: 'category',
                data: [{% for p in ProductMName %}'{{ p }}', {% endfor %}],
                name: 'Products',
                nameLocation: 'center',
                nameGap: 22,
                silent: false,
                splitLine: {
                    show: false
                },
                splitArea: {
                    show: false
                },
                nameTextStyle: {
                    fontWeight: 'bolder'
                },
                axisLabel: {
                    interval: 0,
                    formatter:function(value){  
                        var ret = "";
                        var maxLength = 18;
                        var valLength = value.length;
                        var rowN = Math.ceil(valLength / maxLength);
                        if (rowN > 1)
                        {
                            for (var i=0; i<rowN; i++){
                            var temp = "";
                            var start = i * maxLength;
                            var end = start + maxLength;
                            temp = value.substring(start, end) + "\n";
                            ret += temp;
                            }
                                return ret;
                        }else{
                            return value;
                        }
                    }
                }
            },
            yAxis: {
                type: 'value',
                name: 'FeedbackCnt',
                nameLocation: 'center',
                nameGap: 42,
                splitArea: {
                    show: false
                },
                nameTextStyle: {
                    fontWeight: 'bolder'
                }
            },
            series: [
                {
                type: 'bar',
                data: [{% for tcnt in TotleCount %}{{ tcnt }}, {% endfor %}]
                }
            ]
        };

        myTop.setOption(optionTop);
        myBottom.setOption(optionBottom);

    </script>
</body>
</html>

四、圖表展示

Top 10 Project By Date.png

Top 10 Project By Feedback Count.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 項目管理術語英漢對照表2018-7-20 A Abstract Resource 抽象資源 Abstraction...
    007明_陽閱讀 6,685評論 0 51
  • 公司:常州新日催化劑有限公司 六項精進第422期努力三組 【日精進打卡第80天】 【知~學習】 《六項精進》0遍 ...
    JackChen7閱讀 220評論 0 0
  • 前情提要:從十八層墜下的四人被隨機分成了兩組,分別進入不同的區(qū)域。宋哲和墨鏡男一組;小優(yōu)和君寫意一組,君寫意這一組...
    腐草為瀅閱讀 257評論 0 2
  • 某銀行信用卡的一個視頻廣告突然刷屏了。 一個初到美國留學的男生在一次同學聚會上,想要露一手中國菜給同學錄看看,很簡...
    齊梁小生閱讀 631評論 0 0
  • 講幾個令人悲傷的真實的故事,都是在我日常工作中接觸的女性中發(fā)生的。 一個27歲的姑娘,流產(chǎn)過8次,第一次是17歲,...
    蟲蟲飛飛閱讀 311評論 0 0

友情鏈接更多精彩內容