e-charts_(绚丽canvas)

Posted 辉常努腻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了e-charts_(绚丽canvas)相关的知识,希望对你有一定的参考价值。

导读模块

在我们快速发展的现在的科技行业,已经正在悄悄的发生这转变,众所周知数据一直是软件行业的最重要的核心,而我们的广大用户他们并不是真正的计算机行业的人才,所以对于使用者来说,数据可视化就变的很有必要了,也许有人会说以表格形式呈现不是很好嘛,那还想怎么着,诚然表格展示数据固然很好,但是还不是很直接,为此就诞生了用图来展示数据,这也是广大软件公司所推崇和追求的

  1. 那么我们该怎么展示呢?

    1. Jfreechart:免费,功能一般,效果一般(不怎么绚丽),但是是之前的产物,以前用的比较多,现在用的比较少了,建议了解
    2. e-charts:免费,百度出产的,功能强大,效果(绚丽),近几年的产物,现在国内的众多软件公司用的比较多,推荐学习
    3. Hight-charts:国外产生,功能强大,效果绚丽,据说XX是抄袭他的,在国内用的比较少,建议了解
  2. 用图表工具意思/作用:

    1. 清晰直观的使得数据可视化
    2. 结和后台技术真正做到数据的实时变化,例如可以实现k线图,因为有js定时器
    3. 提升软件产品的用户体验
  3. 使用图表工具的原则:

    1. 既然是工具就是正常使用即可,不能偏离方向,切记不要主次不分
    2. 既然是工具就不能随便的去更改软件本身的源代码和功能,但是可以基于它实现拓展或者自定义开发

1.引出e-charts(canvas框架)

  1. e-charts:是百度出产一个免费的用于图表展示的工具,因其强大的功能和简易上手深受广大程序员喜爱,同时因其绚丽多彩的效果在同类软件中不断深受好评

  2. 先导知识:要想学习和使用E-ctarts必须要具备的技能:html ,CSS,JS,Jquery ,Json等

  3. 官网:http://echarts.baidu.com/,现在是隶属于apache了,所以网址也变了:https://echarts.apache.org/

  4. 进行商业开发的软件版本为:

    • 2.x:e-charts2.x版本的底层更多是依赖底层zrender
    • 3.x :不再强制使用 AMD 的方式按需引入,引入方式简单了很多,只需要像普通的 javascript 库一样用 script 标签引入
    • 补充:AMD:Asynchronous Module Definition,意思为:异步模块定义
  5. 官网的使用和介绍:

    • 文档:可以下载和查看相关的API和教程
    • 下载:可以下载软件,可以下载主题数据,地图数据,扩展数据,这里所谓的数据其实就是一些.js文件或者json文件,详细可以去参考下载数据文件夹
    • 实例:下载官方给出的实例,甚至可以在线编辑在线预览
    • 社区:可以讨论和参考下载别人例子的地方
    • 工具:在线生成一些数据,例如可以生成某个省份或者市区的数据的.js文件
    • 关于:项目介绍和版权归属的信息的公布

2.e-charts应用举例

e-charts最原始的单条柱状图代码 (json串)

option = {
    xAxis: {
        type: 'category',  //坐标轴类型,取值为 'value':意思为数值轴,适用于连续数据;'category':意思为类目轴,适用于离散的类目数据例如星期几,且常配合data属性
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']//x轴上显示的数据
    },
    yAxis: {
        type: 'value'//y轴显示的类型为数值轴
    },
    series: [{
        data: [120, 200, 150, 80, 70, 110, 130],//y轴显示的数据的具体指,其实也就是柱状图的高度
        type: 'bar'//显示的图形的类型为柱状图
    }]
};

改进的两条柱状图代码(json串)

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));

// 指定图表的配置项和数据
var option = {
    tooltip: {},
    legend: {//显示策略
        data:['已处理','在处理']//显示两条柱状图
    },
    xAxis: {
        data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
    },
    yAxis: {

    },
    series: [
        {
            name: '已处理',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        },
        {
            name: '在处理',
            type: 'bar',
            data: [1, 10, 16, 10, 14, 10]
        }
    ]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);

在改进显示三条柱状图代码(json串)

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));

// 指定图表的配置项和数据
var option = {
    title: {  
        //主标题文本,'\\n'指定换行  
        text: 'XX公司2018年的财务统计报告',  
        //主标题文本超链接  
        link: 'http://www.baidu.com',  
        //副标题文本,'\\n'指定换行  
        //subtext: 'www.stepday.com',  
        //副标题文本超链接  
        // sublink: 'http://www.stepday.com/myblog/?Echarts',  
        //水平安放位置,默认为左侧,可选为:'center' | 'left' | 'right' | {number}(x坐标,单位px)  
        x: '180px',  
        //垂直安放位置,默认为全图顶端,可选为:'top' | 'bottom' | 'center' | {number}(y坐标,单位px)  
        y: '20px'  
    },	
    tooltip: {
        //触发类型,默认('item')数据触发,可选为:'item'(数据触发,其实就是提示窗显示数据) | 'axis'(轴线触发,其实就是提示窗显示轴线)
        trigger: 'axis' 
    },
    legend: {
        //显示策略,可选为:true(显示) | false(隐藏),默认值为true  
        show: true, 
        //水平安放位置,默认为全图居中,可选为:'center' | 'left' | 'right' | {number}(x坐标,单位px)  
        x: 'center',  
        //垂直安放位置,默认为全图顶端,可选为:'top' | 'bottom' | 'center' | {number}(y坐标,单位px)  
        y: 'top',  
        data:['收入','预算','支出']
    },
    xAxis: {
        type: 'category', 
        data: ["第一季度","第二季度","第三季度","第四季度"],
        name:'季度'
    },
    yAxis: {
        show: true,   //是否显示 y 轴,默认显示,但是设置为false就不显示了
        type: 'value',坐标轴类型。'value' 数值轴,适用于连续数据。'category' 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据
        name:'金额(元)'
    },
    series: [
        {
            name: '收入',
            type: 'bar',
            markPoint: {  
                data: [  
                    {type: 'max', name: '最大值'},  
                    {type: 'min', name: '最小值'}  
                ]  
            }, 
            markLine: {  
                data: [  
                    {type: 'average', name: '平均值'}  
                ]  
            },
            data: shouruData
        },
        {
            name: '预算',
            type: 'bar',
            markPoint: {  
                data: [  
                    {type: 'max', name: '最大值'},  
                    {type: 'min', name: '最小值'}  
                ]  
            }, 
            markLine: {  
                data: [  
                    {type: 'average', name: '平均值'}  
                ]  
            },
            data: yusuanData
        },
        {
            name: '支出',
            type: 'bar',
            markPoint: {  
                data: [  
                    {type: 'max', name: '最大值'},  
                    {type: 'min', name: '最小值'}  
                ]  
            }, 
            markLine: {  
                data: [  
                    {type: 'average', name: '平均值'}  
                ]  
            },

            data: zhichuData
        }
    ]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);

2.1柱状图的MVC层

M层

package com.turing.manage.manager;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.turing.dao.Dao;
import com.turing.dao.DaoImpl;
/**
 * E-charts的 M层 实现类
 * @author Li Ya Hui 
 * @time   2021年6月15日 下午8:45:49
 */

public class TuServiceImpl implements ITuService {
    Dao dao=new DaoImpl();

    @Override
    public List<Map<String, Object>> queryShouRu() throws ClassNotFoundException, SQLException {

        return dao.executeQueryForList(" SELECT  QUARTER(riqi) jidu,SUM(shouRuJinEr) jiner  FROM   shouru  GROUP BY  QUARTER(riqi)    ");
    }
    @Override
    public List<Map<String, Object>> queryZhiChu() throws ClassNotFoundException, SQLException {
        return dao.executeQueryForList(" SELECT  QUARTER(riqi) jidu,SUM(zhiChuJinEr) jiner  FROM   zhichu  GROUP BY  QUARTER(riqi)    ");
    }
    @Override
    public List<Map<String, Object>> queryYuSuan() throws ClassNotFoundException, SQLException {
        return dao.executeQueryForList(" SELECT  QUARTER(riqi) jidu,SUM(yuSuanJinEr) jiner  FROM   yusuan  GROUP BY  QUARTER(riqi)    ");
    }
    @Override
    public List<Map<String, Object>> queryXueLi() throws ClassNotFoundException, SQLException {
        return dao.executeQueryForList("  select count(*) renshu ,xueli from yuangongxinxi  GROUP BY xueli  ");
    }
    @Override
    public List<Map<String, Object>> queryZheXian() throws ClassNotFoundException, SQLException {
        return dao.executeQueryForList(" select * from zuoye ");
    }
    @Override
    public List<Map<String, Object>> queryFenbu() throws ClassNotFoundException, SQLException {
        return dao.executeQueryForList(" SELECT LEFT(stu_native, LOCATE('#',stu_native)-1) shengfen,COUNT(*)renshu FROM xuesheng   GROUP BY  LEFT(stu_native, LOCATE('#',stu_native)-1)");
    }
}

C层

package com.turing.manage.manager;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @desc   C层
 * @author Li Ya Hui 
 * @time   2021年6月15日 下午8:41:33
 */

@SuppressWarnings("serial")
public class TuServlet extends HttpServlet {
    ITuService tuService=new TuServiceImpl();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        String method=request.getParameter("method");
        try {
            if (method.equals("zhuTu")) {
                this.zhuTu(request,response);
            }
            else if (method.equals("bingTu")) {
                this.bingTu(request,response);
            }
            else if (method.equals("zheXianTu"))
            {
                this.zheXianTu(request,response);	
            }
            else if (method.equals("fenBuTu"))
            {
                this.fenBuTu(request,response);	
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
 * @desc  4.分布图
 * @param request
 * @param response
 * @throws IOException 
 * @throws ServletException 
 * @throws SQLException 
 * @throws ClassNotFoundException 
 */
    private void fenBuTu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
        List<Map<String, Object>> list_fenbu=tuService.queryFenbu();
        request.setAttribute("list_fenbu", list_fenbu);
        request.getRequestDispatcher("/qxt/fb.jsp").forward(request, response);
    }
    /**
 * @desc 3.折线图
 * @param request
 * @param response
 * @throws IOException 
 * @throws ServletException 
 * @throws SQLException 
 * @throws ClassNotFoundException 
 */
    private void zheXianTu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
        List<Map<String, Object>> list_zhexian=tuService.queryZheXian();
        request.setAttribute("list_zhexian", list_zhexian);
        request.getRequestDispatcher("/jsps/tu/zheXian.jsp").forward(request, response);	
    }
    /**
 * @desc  2.饼图
 * @param request
 * @param response
 * @throws IOException 
 * @throws ServletException 
 * @throws SQLException 
 * @throws ClassNotFoundException 
 */
    private void bingTu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
        List<Map<String, Object>> list_xueli=tuService.queryXueLi();
        request.setAttribute("list_xueli", list_xueli);
        request.getRequestDispatcher("/jsps/tu/bingTu.jsp").forward(request, response);
    }
    /**
 * @desc  1.柱状图
 * @param request
 * @param response
 * @throws SQLException 
 * @throws ClassNotFoundException 
 * @throws IOException 
 * @throws ServletException 
 */
    private void zhuTu(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, ServletException, IOException {
        //1.取出数据
        //收入
        List<Map<String, Object>> list_shouru=tuService.queryShouRu();
        //支出
        List<Map<String, Object>> list_zhichu=tuService.queryZhiChu();
        //预算
        List<Map<String, Object>> list_yusuan=tuService.queryYuSuan();
        //2.存入request作用域中
        request.setAttribute("list_shouru",list_shouru );
        request.setAttribute("list_zhichu",list_zhichu );
        request.setAttribute("list_yusuan", list_yusuan);
        //3.转向
        request.getRequestDispatcher("/jsps/tu/zhuTu.jsp").forward(request, response);
    }
}

V层(柱状图) json有注释,不懂也可以在百度

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<%
			String base = request.getContextPath()+"/";
			String url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+base;
		%>
		<base href="<%=url%>">
	
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<script type="text/javascript" src="./js/echarts/echarts.js"></script>
		<script type="text/javascript" src="./js/jquery/jquery.js"></script>
		<title>e-charts应用举例之通过柱状图显示公司的全年--季度财务统计报告</title>
	</head>
<body>
	<div id="main" style="width: 600px;heightcanvas基础绘制-绚丽倒计时

HTML5 Canvas绚丽的小球详解

百度开源e-chart初探

使用canvas实现超绚丽的旋转正方形

canvas绘图详解-03-绚丽的倒计时效果

E-chart图表显示单位