关于flask入门教程-ajax+echarts实现热力图

2022-03-11 17:18:36 浏览数 (1)

热力图 (Heatmap) 通过色彩变化来显示数据,热力图适合用来交叉检查多变量的数据。显示是否有彼此相似的变量;以及检测彼此之间是否存在任何相关性。也可以展现随着时间的变化指标的发展。

热力图依赖颜色来表达数值,它比较适合用来显示广泛数值数据,因为要准确地指出色调之间的差异始终有难度,也较难从中提取特定数据点。

与折线图相比,当折线过多的时候,相互之间会受到影响。

热力图的数据构造有点小麻烦,热力点是以类似坐标形式存在的,要先构造出x轴和y轴的坐标,再将热力数据转换成坐标格式。

代码语言:javascript复制
@app.route('/getjson9', methods=['GET'])
def getjson9():
    # 千万不要先将内部的对象序列化成字符串,然后再序列化外边的对象。
    # 再复杂的结构都可以表示为一个dict,
    # 而之前不需要做任何序列化操作!!!
    # 经过多轮测试,提前序列化会导致很多解析问题!!!
    # where year>='2000' and year<='2010'
    year = db.session.execute("select distinct year from economyinfo").fetchall()
    # yearjson = json.dumps({'year': [x['year'] for x in year]}, ensure_ascii=True)
    # yearjsonify = jsonify(year=[x['year'] for x in year])
    yearlist = [x['year'] for x in year]
    #print(yearlist)
    yeardict = {element:i for i, element in enumerate(yearlist)}
    # {'1950': 0, '1951': 1, '1952': 2, '1953': 3, '1954': 4, '1955': 5, '1956': 6, '1957': 7, '1958': 8, '1959': 9, '1960': 10,
    # '1961': 11, '1962': 12, '1963': 13, '1964': 14, '1965': 15, '1966': 16, '1967': 17, '1968': 18, '1969': 19, '1970': 20,
    # '1971': 21, '1972': 22, '1973': 23, '1974': 24, '1975': 25, '1976': 26, '1977': 27, '1978': 28, '1979': 29, '1980': 30,
    # '1981': 31, '1982': 32, '1983': 33, '1984': 34, '1985': 35, '1986': 36, '1987': 37, '1988': 38, '1989': 39, '1990': 40,
    # '1991': 41, '1992': 42, '1993': 43, '1994': 44, '1995': 45, '1996': 46, '1997': 47, '1998': 48, '1999': 49, '2000': 50,
    # '2001': 51, '2002': 52, '2003': 53, '2004': 54, '2005': 55, '2006': 56, '2007': 57, '2008': 58, '2009': 59, '2010': 60}
    #  where region in ('北京市','天津市','河北省')
    region = db.session.execute("select distinct region from economyinfo").fetchall()
    # regionjsonify = jsonify(region=[x['region'] for x in region])
    # regionjson = json.dumps({'region':[x['region'] for x in region]},ensure_ascii=True)
    regionlist = [x['region'] for x in region]
    #print(regionlist)
    regiondict = {element:i for i, element in enumerate(regionlist)}
    # {'北京市': 0, '天津市': 1, '河北省': 2, '山西省': 3, '内蒙古自治区': 4, '辽宁省': 5, '吉林省': 6, '黑龙江省': 7, '上海市': 8,
    # '江苏省': 9, '浙江省': 10, '安徽省': 11, '福建省': 12, '江西省': 13, '山东省': 14, '河南省': 15, '湖北省': 16, '湖南省': 17,
    # '广东省': 18, '广西壮族自治区': 19, '海南省': 20, '重庆市': 21, '四川省': 22, '贵州省': 23, '云南省': 24, '西藏自治区': 25,
    # '陕西省': 26, '甘肃省': 27, '青海省': 28, '宁夏回族自治区': 29, '新疆维吾尔自治区': 30}
    #  where region in ('北京市','天津市','河北省') and year>='2000' and year<='2010'
    sql = "select year,region,GDP from economyinfo"
    sql_data = pd.DataFrame(db.session.execute(sql).fetchall())
    sql_data.columns = [i[0] for i in db.session.execute(sql).cursor.description]
    #       year    region       GDP
    # 0     1950       北京市    -95.00
    # 1     1950       天津市    -95.00
    # 2     1950       河北省    -95.00
    # 3     1950       山西省    -95.00
    datadict = sql_data.to_dict('records')
    # [{'year': '1950', 'region': '北京市', 'GDP': -95.0},
    # {'year': '1950', 'region': '天津市', 'GDP': -95.0},
    # ....
    # {'year': '1950', 'region': '河北省', 'GDP': -95.0}]
    datalist=[[yeardict[gdpdata['year']], regiondict[gdpdata['region']], gdpdata['GDP']] for gdpdata in datadict]
    # [[0, 0, -95.0],
    # [0, 1, -95.0],
    # [0, 2, -95.0]
    gdpdata = {}
    gdpdata['region'] = regionlist
    gdpdata['year'] = yearlist
    gdpdata['data'] = datalist

    response = jsonify(gdpdata)
    #print(gdpdata)
    response.status_code = 200  # or 400 or whatever
    return jsonify(gdpdata)

@app.route('/echartdemo9')
def echartdemo9():
    return render_template('echartdemo9.html')

后端数据处理好了,前端代码直接套用就好了

代码语言:javascript复制
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <!--script src="..staticjsecharts.min.js"></script-->
    <script src="/static/js/echarts.min.js"></script>
    <script src="/static/js/jquery.js"></script>
  </head>
  <body>
    <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
    <div id="main" style="width: 1200px;height:800px;"></div>
    <script type="text/javascript">
      // 基于准备好的dom,初始化echarts实例
      
      var myChart = echarts.init(document.getElementById('main'));
      // 指定图表的配置项和数据
      myChart.option = {
     xAxis: {
       type: 'category',
       data: []
     },
     yAxis: {
       type: 'value'
     },
     series: [
       {
         data: [],
         type: 'line'
       }
     ]
      };
   
      // 使用刚指定的配置项和数据显示图表。
      myChart.hideLoading();
      $.ajax({
       url:'/getjson9',
       result:{},
       type:'GET',
       dataType:'json',
       success:function(result){

         //prettier-ignore
         //result={
         //'region': ['北京市', '天津市', '河北省'], 
         //'year': ['2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010'], 
         //'data': [[0, 0, 3161.7], [0, 1, 1701.88], [0, 2, 5043.96], [1, 0, 3708.0], [1, 1, 1919.09], [1, 2, 5516.7629], [2, 0, 4315.0], [2, 1, 2150.76], [2, 2, 6018.2817], [3, 0, 5007.2], [3, 1, 2578.03], 
         //           [3, 2, 6921.2895], [4, 0, 6033.2], [4, 1, 3110.97], [4, 2, 8477.63], [5, 0, 6969.5], [5, 1, 3905.64], [5, 2, 10012.11], [6, 0, 8117.8], [6, 1, 4462.74], [6, 2, 11467.6], [7, 0, 9846.8], 
         //           [7, 1, 5252.76], [7, 2, 13607.32], [8, 0, 11115.0], [8, 1, 6719.01], [8, 2, 16011.97], [9, 0, 12153.0], [9, 1, 7521.85], [9, 2, 17235.48], [10, 0, 14113.6], [10, 1, 9224.46], [10, 2, 20394.26]
         //]}
         const hours = result.year;
         // prettier-ignore
         const days =result.region
         // prettier-ignore
         const data = result.data
             .map(function (item) {
             return [item[0], item[1], item[2] || '-'];
         });
         myChart.setOption(
         (option = {
           tooltip: {
             position: 'top'
           },
           grid: {
             height: '50%',
             top: '10%'
           },
           xAxis: {
             type: 'category',
             data: hours,
             splitArea: {
               show: true
             }
           },
           yAxis: {
             type: 'category',
             data: days,
                axisLabel: {
                    inside: false,
                    textStyle: {
                        color: '#000',
                        fontSize:'7',
                        itemSize:''
                    }
                },
             splitArea: {
               show: true
             }
           },
           visualMap: {
             min: 0,
             max: 50000,
             calculable: true,
             orient: 'horizontal',
             left: 'center',
             bottom: '15%'
           },
           series: [
             {
               name: 'Punch Card',
               type: 'heatmap',
               data: data,
               label: {
                 show: false
               },
               emphasis: {
                 itemStyle: {
                   shadowBlur: 10,
                   shadowColor: 'rgba(0, 0, 0, 0.5)'
                 }
               }
             }
           ]
         })
         );
       },
       error:function (msg) {
         console.log(msg);
                   alert('系统发生错误');
            }
      })
      
      
    </script>
 </body>
 </html>

0 人点赞