数据分析之使用 HightCharts 将数据库中的数据可视化

前言

曾经使用 Java 去写一个报表,以便可视化数据,分析数据,但界面十分简陋,逻辑又不怎么符合前后端分离时代的开发模式
链接如下:
初步使用 JFreeChart 生成报表与感受

最近的研究的一个项目,涉及到报表,一想到 JFreeChart 就恶心。
HightCharts 的出现,以简单的操作、美观的界面,令人十分满意。

附:
HightCharts API:https://www.highcharts.com/docs
参考文章:highcharts的引用

下面来个项目中应用的 demo,以备记录

效果1

开篇先来效果,才有心情研究代码,里边的数据,就那身处的学校的一个软件开发团队的为例(理想发展状态)

这里写图片描述

可以看到,界面是还是相当美观的,鼠标放到对应的条形柱上,会显示对应条形柱的数据

代码1

有了效果,想必想探究一下代码了,而代码是十分简单的

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>HightCharts</title>
        <!--注意使用 HightCharts 要先引入 jQuery -->
        <script type="text/javascript" src="js/jquery-1.7.2.js"></script>
        <script type="text/javascript" src="highcharts4/js/highcharts.js"></script>
        <!--加上自动切换主题-->
        <script type="text/javascript" src="highcharts4/js/themes/sand-signika.js" ></script>
    </head>
    <body>
        <div style="padding-left: 10px;padding-right: 10px;border: 0px;height: 350px">
            <div id="container"></div>
        </div>

        <script type="text/javascript">
            // var chart= 可省略,这点和 Vue 差不多。不同的是里边的属性写少了会报错
            var chart = new Highcharts.Chart({
                // 渲染、事件
                chart: {
                    // 指定渲染的 div 的 id
                    renderTo: "container",
                    //指定类型,column 最简单了
                    type: 'column'
                },
                // 报表的标题
                title: {
                    text: 'ITAEM 团队分析'
                },
                // 横坐标
                xAxis: {
                    //横坐标标题
                    title: '方向',
                    //横坐标柱条名,这里相当于初始化,实际的话会再次动态加载(没写会报错~)
                    categories: [
                        "产品经理",
                        "UI",
                        '前端',
                        '后台',
                        "安卓",
                        "IOS",
                        '运维',
                        "项目经理",
                        "人工智能",
                        "大数据",
                        "产品测试"
                    ]
                },
                // 纵坐标
                yAxis: {
                    //纵坐标标题
                    title: {
                        text: '数量'
                    }
                },
                // 数据,数组对象(因为是二维的)
                series: [{
                    //整个表最下方的名称
                    name: 'ITAEM 成员',
                    //赋予柱条值,即高度,这里相当于初始化,实际的话会再次动态加载(没写会报错~)
                    data: [1, 2, 3, 4, 2, 1, 1, 1, 2, 2, 1]
                }]
            });
        </script>
    </body>

</html>

此时应该注意到,这里边的的数据是静态的,下面来个动态获取数据、显示数据、生成报表

效果2

下面换了个主题

这里写图片描述
注意到这里的数据和上面不一样了,虽然里边的数据没有改,详情可以看下面的代码

代码2

关键是 Highcharts 里边加了一个 events 属性,通过里边绑定事件,发送 Ajax 请求,获取数据,再渲染到报表上,就覆盖了默认的静态数据了

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>HightCharts</title>
        <!--注意使用 HightCharts 要先引入 jQuery -->
        <script type="text/javascript" src="js/jquery-1.7.2.js"></script>
        <script type="text/javascript" src="highcharts4/js/highcharts.js"></script>
        <!--加上自动切换主题-->
        <script type="text/javascript" src="highcharts4/js/themes/dark-unica.js"></script>
    </head>

    <body>
        <div style="padding-left: 10px;padding-right: 10px;border: 0px;height: 350px">
            <div id="container"></div>
        </div>

        <script type="text/javascript">
            // var chart= 可省略,这点和 Vue 差不多。不同的是里边的属性写少了会报错
            var chart = new Highcharts.Chart({
                // 渲染、事件
                chart: {
                    // 指定渲染的 div 的 id
                    renderTo: "container",
                    //指定类型,column 最简单了
                    type: 'column',
                    //根据事件加载数据,最重要的
                    events: {
                        // 主要就使用 load 属性
                        load: function(event) {
                            $.post("http://localhost/team/all", {}, function(result) {
                                var rows = result
                                var xArr = new Array();
                                var yArr = new Array();
                                for(var i = 0; i < rows.length; i++) {
                                    xArr.push(rows[i].direction);
                                    yArr.push(rows[i].number);
                                }
                                chart.xAxis[0].categories = xArr;
                                chart.series[0].setData(yArr);

                            }, "json");
                        }
                    }
                },
                // 报表的标题
                title: {
                    text: 'ITAEM 团队分析'
                },
                // 横坐标
                xAxis: {
                    //横坐标标题
                    title: '方向',
                    //横坐标柱条名,这里相当于初始化,实际的话会再次动态加载(没写会报错~)
                    categories: [
                        "产品经理",
                        "UI",
                        '前端',
                        '后台',
                        "安卓",
                        "IOS",
                        '运维',
                        "项目经理",
                        "人工智能",
                        "大数据",
                        "产品测试"
                    ]
                },
                // 纵坐标
                yAxis: {
                    //纵坐标标题
                    title: {
                        text: '数量'
                    }
                },
                // 数据,数组对象(因为是二维的)
                series: [{
                    //整个表最下方的名称
                    name: 'ITAEM 成员',
                    //赋予柱条值,即高度,这里相当于初始化,实际的话会再次动态加载(没写会报错~)
                    data: [1, 2, 3, 4, 2, 1, 1, 1, 2, 2, 1]
                }]
            });
        </script>
    </body>

</html>

具体的 JSON 字符串如下

[
  {
    "id": 1,
    "direction": "产品经理",
    "number": 2
  },
  {
    "id": 2,
    "direction": "UI",
    "number": 4
  },
  {
    "id": 3,
    "direction": "前端",
    "number": 5
  },
  {
    "id": 4,
    "direction": "后台",
    "number": 3
  },
  {
    "id": 5,
    "direction": "安卓",
    "number": 4
  },
  {
    "id": 6,
    "direction": "IOS",
    "number": 2
  },
  {
    "id": 7,
    "direction": "运维",
    "number": 5
  },
  {
    "id": 8,
    "direction": "项目经理",
    "number": 2
  },
  {
    "id": 9,
    "direction": "人工智能",
    "number": 4
  },
  {
    "id": 10,
    "direction": "大数据",
    "number": 3
  },
  {
    "id": 11,
    "direction": "产品测试",
    "number": 1
  }
]

其他

有兴趣的话,可以看后台(SpringBoot+JPA+MySQL)

1、数据库表及其数据

这里写图片描述

2、Java 代码
①代码结构

这里写图片描述

②entity
package com.cun.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_team")
public class Team {

    @Id
    @GeneratedValue
    private Integer id; // 主键

    @Column(length = 100)
    private String direction; // 方向

    private Integer number; // 人数

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDirection() {
        return direction;
    }

    public void setDirection(String direction) {
        this.direction = direction;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    public Team() { // JPA 必备
        super();
    }

}
③ dao
package com.cun.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.cun.entity.Team;

public interface TeamDao extends JpaRepository<Team, Integer>{

}
④Controller
package com.cun.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cun.dao.TeamDao;
import com.cun.entity.Team;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@RequestMapping("/team")
@RestController
@EnableSwagger2
public class TeamController {

    @Autowired
    private TeamDao teamDao;

    //这里按道理应是 GetMapping 请求,为了使用 jQuery 的 $.post 才使用 PostMapping
    @PostMapping("/all")
    public List<Team> getListTeam() {
        return teamDao.findAll();
    }

}
⑤ yml
server:
  port: 80 #为了以后访问项目不用写端口号
  context-path: / #为了以后访问项目不用写项目名
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testspring?useUnicode=true&characterEncoding=utf-8  #解决中文乱码的问题
    username: root
    password: 123
  jpa: 
    hibernate:
      ddl-auto: update  #数据库同步代码
    show-sql: true      #dao操作时,显示sql语句
⑥ pom

这里写图片描述

⑦Swagger

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值