echarts:多折线动态图

多折线动态图
在这里插入图片描述话不多说,先上代码
页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<script type="text/javascript" src="../js/echarts.js"></script>
<script type="text/javascript" src="../js/jquery.js"></script>
<head>
    <title>多折线动态统计图</title>
</head>
<body>
开始日期<input type="date" name="btime" id="btime"/>
结束日期<input type="date" name="etime" id="etime"/><input type="button" onclick="shaixuan()" value="查询"/>
<div id="chartmain" style="width:80%; height:80%; margin-top:50px;"></div>
<script type="text/javascript">
$(function(){
//初始化,月初到现在的
    $.ajax({
        type:'post',
        url:'/moreline',
        data:{}
        dataType:'json',
        success:function(result){
            if(result=="error"){
                alert("程序出现问题,请与管理员联系!");
                return false;
            }else{
                var ll = [];//图例
                var tmp = [];//数值
                var date = [];//日期
                $.each(result,function(){
                    var setLegend = this.categories;
                    var data = this.vals;
                    var setDate = this.labels;
                    $.each(setLegend,function(i){
                        ll.push(setLegend[i]);//图例获取
                    });
                    $.each(setDate,function(i){
                        date.push(setDate[i]);//日期获取
                    });
         			//值获取
                    for (var int = 0; int < setLegend.length; int++) {
                        var tmpVal = {
                            name : setLegend[int],
                            type : 'line',
                            smooth : true,
                            showSymbol : true,
                            data : data[int]
                        };
                        tmp[int] = tmpVal;
                    }
                });
                 var myChart = echarts.init(document.getElementById('chartmain'));
                var option = {
                    title: {
                        text: '阻断申请命中率'
                    },
                    toolbox: {
                        show : true,//是否显示工具栏组件
                        showTitle:true,                             //是否在鼠标 hover 的时候显示每个工具 icon 的标题
                        //orient : 'vertical',
                        feature : {
                            mark : {show: true},
                            dataView : {
                                show: true,
                                readOnly: false,
                                show: true,                         //是否显示该工具。
                                title:"数据视图",
                                readOnly: false,                    //是否不可编辑(只读)
                                lang: ['数据视图', '关闭', '刷新'],  //数据视图上有三个话术,默认是['数据视图', '关闭', '刷新']
                                backgroundColor:"#fff",             //数据视图浮层背景色。
                                textareaColor:"#fff",               //数据视图浮层文本输入区背景色
                                textareaBorderColor:"#333",         //数据视图浮层文本输入区边框颜色
                                textColor:"#000",                    //文本颜色。
                                buttonColor:"#c23531",              //按钮颜色。
                                buttonTextColor:"#fff"             //按钮文本颜色。

                            },

                            restore : {show: true},
                            saveAsImage : {show: true},
                            magicType: {                            //动态类型切换
                                show: true,
                                title:"切换",                       //各个类型的标题文本,可以分别配置。
                                type: ['line', 'bar']             //启用的动态类型,包括'line'(切换为折线图), 'bar'(切换为柱状图), 'stack'(切换为堆叠模式), 'tiled'(切换为平铺模式)
                            }
                        }
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    legend: {
                        top:'10%',
                        x: 'right',//居右显示
                        orient: 'vertical',  //垂直显示
                        y: 'center',    //延Y轴居中
                        data:ll
                    },
                    grid: {
                        left: '3%',
                        right: '15%',
                        bottom: '3%',
                        containLabel: true
                    },
                    xAxis: {
                        type: 'category',
                        boundaryGap: false,
                        data: date
                    },
                    yAxis: {
                        type: 'value',
                        name: '命中占比',
                        axisLabel: {
                            formatter: '{value} %'
                        }
                    },
                    series: tmp }
                myChart.setOption(option);
                return true;
            }
      }
    });
});
//根据日期筛选显示
    function shaixuan(){
        var startDate = $("#btime").val();
        var endDate = $("#etime").val();
        $.ajax({
            type:'post',
            url:'/moreline',
            data:{
                startDate : startDate,
                endDate : endDate,
            },
            dataType:'json',
            success:function(result){
                if(result=="error"){
                    alert("程序出现问题,请与管理员联系!");
                    return false;
                }else{
                    var ll = [];//图例
                    var tmp = [];//数值
                    var date = [];//日期
                    $.each(result,function(){
                        var setLegend = this.categories;
                        var data = this.vals;
                        var setDate = this.labels;
                        $.each(setLegend,function(i){
                            ll.push(setLegend[i]);
                        });
                        $.each(setDate,function(i){
                            date.push(setDate[i]);
                        });
                        for (var int = 0; int < setLegend.length; int++) {
                            var tmpVal = {
                                name : setLegend[int],
                                type : 'line',
                                smooth : true,
                                showSymbol : true,
                                /*label : {
                                    normal : {
                                        position : 'right',
                                        formatter : '{b}'//
                                    }
                                },*/
                                data : data[int]
                            };
                            tmp[int] = tmpVal;
                        }
                    });
                    var myChart = echarts.init(document.getElementById('chartmain'));
                    var option = {
                        title: {
                            text: '阻断申请命中率'
                        },
                        toolbox: {
                            show : true,//是否显示工具栏组件
                            showTitle:true,                             //是否在鼠标 hover 的时候显示每个工具 icon 的标题
                            //orient : 'vertical',
                            feature : {
                                mark : {show: true},
                                dataView : {show: true, readOnly: false,
                                    show: true,                         //是否显示该工具。
                                    title:"数据视图",
                                    readOnly: false,                    //是否不可编辑(只读)
                                    lang: ['数据视图', '关闭', '刷新'],  //数据视图上有三个话术,默认是['数据视图', '关闭', '刷新']
                                    backgroundColor:"#fff",             //数据视图浮层背景色。
                                    textareaColor:"#fff",               //数据视图浮层文本输入区背景色
                                    textareaBorderColor:"#333",         //数据视图浮层文本输入区边框颜色
                                    textColor:"#000",                    //文本颜色。
                                    buttonColor:"#c23531",              //按钮颜色。
                                    buttonTextColor:"#fff",             //按钮文本颜色。

                                },

                                restore : {show: true},
                                saveAsImage : {show: true},
                                magicType: {                            //动态类型切换
                                    show: true,
                                    title:"切换",                       //各个类型的标题文本,可以分别配置。
                                    type: ['line', 'bar'],              //启用的动态类型,包括'line'(切换为折线图), 'bar'(切换为柱状图), 'stack'(切换为堆叠模式), 'tiled'(切换为平铺模式)
                                },
                            }
                        },
                        tooltip: {
                            trigger: 'axis'
                        },
                        legend: {
                            top:'10%',
                            x: 'right',//居右显示
                            orient: 'vertical',  //垂直显示
                            y: 'center',    //延Y轴居中
                            data:ll
                        },
                        grid: {
                            left: '3%',
                            right: '15%',
                            bottom: '3%',

                            containLabel: true
                        },
                        xAxis: {
                            type: 'category',
                            boundaryGap: false,
                            /* axisLabel : {
                                 interval : 0,// 横轴信息全部显示
                                 rotate : -30
                             // -30度角倾斜显示
                             },*/
                            data: date
                        },
                        yAxis: {
                            type: 'value',
                            name: '命中占比',

                            axisLabel: {
                                formatter: '{value} %'
                            }
                        },
                        series: tmp
                    }
                    myChart.setOption(option);
                    return true;
                }
            }
        });
    }

</script>

Controller代码

@Controller
public class LineTestController {
    @Resource
    private LineTestService lineTestService;

    /**
     * 页面跳转
     * @return
     */
    @RequestMapping("change")
    public String change(){
        return "lineTest";//此处为jsp页面
    }

    @RequestMapping("moreline")
    @ResponseBody
    public Object moreLine(LineTest lineTest){
        Object map=lineTestService.moreLine(lineTest);
        String result = null;
        result = JSONArray.fromObject(map).toString();
        System.out.println(result);
        return result;
    }

Service层代码
敲黑板!!Google Guava一定要引包
这里用到了两个工具类,用来格式化日期和数据

@Service
public class LineTestServiceImpl implements LineTestService {
    @Resource
    private LineTestDao lineTestDao;
    @Override
    public Object moreLine(LineTest lineTest) {
        String[] dateList;
        List<Map> data = new ArrayList<Map>();
        Calendar cale = null;
        Map map = new HashMap();
        cale = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String firstday, lastday;
        // 获取前月的第一天
        cale = Calendar.getInstance();
        cale.add(Calendar.MONTH, 0);
        cale.set(Calendar.DAY_OF_MONTH, 1);
        firstday = format.format(cale.getTime());
        Date d = new Date();
        System.out.println(d);
        String nowDay = format.format(d);
        LineDataUtil lineInstance = new LineDataUtil();
        //Google Guava Table 强大的集合类 Table<行,列,值>  注意。。引包
            Table<Object,Object, Object> echarsList = HashBasedTable.create();
        //echarts初始化,判断筛选日期是否传值;1:未传值,查询月初到现在,2:有筛选日期按照筛选日期来
        if(StringUtils.isNotBlank(lineTest.getStartDate())&&StringUtils.isNotBlank(lineTest.getEndDate())){
            dateList = DateUtil.getEveryDay(lineTest.getStartDate(),lineTest.getEndDate());// 获取日期
            data = lineTestDao.lineList(lineTest);
        }else{
            lineTest.setStartDate(firstday);
            lineTest.setEndDate(nowDay);
            dateList = DateUtil.getEveryDay(firstday,nowDay);// 获取日期
            data = lineTestDao.lineList(lineTest);
        }
        //按照行列取值    注意!!!日期格式;类型一定为String,数据库同步!!!这是一个大坑
        for (int i = 0; i < data.size(); i++) {
            echarsList.put(data.get(i).get("dt"), data.get(i).get("rule_name"),data.get(i).get("nvl"));//在Table中添加行,列,值
            String rule_name=data.get(i).get("rule_name").toString();
            if (!lineInstance.getCategories().contains(rule_name)) {
                lineInstance.addCategory(rule_name);//添加图例
            }
        }
        for (String date : dateList) {
            lineInstance.addLabel(date); //添加x轴  日期
        }
        Object[] arr = null;
        for (String sn : lineInstance.getCategories()) {
            arr=new String[dateList.length];
            for (int i=0;i<dateList.length;i++) {
                arr[i]=echarsList.get(dateList[i], sn);//Table get方法 返回对应于给定的行和列键,如果没有这样的映射存在值,返回null
            }
            lineInstance.addValList(arr);//填充数据
        }
        return lineInstance;
    }
}

日期格式化

public class DateUtil {
    // 默认日期格式
    public static final String DATE_DEFAULT_FORMAT = "yyyy-MM-dd";

    // 默认时间格式
    public static final String DATETIME_DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static final String TIME_DEFAULT_FORMAT = "HH:mm:ss";

    // 日期格式化
    private static DateFormat dateFormat = null;

    // 时间格式化
    private static DateFormat dateTimeFormat = null;

    private static DateFormat timeFormat = null;

    private static Calendar gregorianCalendar = null;

    static {
        dateFormat = new SimpleDateFormat(DATE_DEFAULT_FORMAT);
        dateTimeFormat = new SimpleDateFormat(DATETIME_DEFAULT_FORMAT);
        timeFormat = new SimpleDateFormat(TIME_DEFAULT_FORMAT);
        gregorianCalendar = new GregorianCalendar();
    }

    /**
     * 日期格式化yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static Date formatDate(String date, String format) {
        try {
            return new SimpleDateFormat(format).parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 日期格式化yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String getDateFormat(Date date) {
        return dateFormat.format(date);
    }

    /**
     * 日期格式化yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String getDateTimeFormat(Date date) {
        return dateTimeFormat.format(date);
    }

    /**
     * 时间格式化
     *
     * @param date
     * @return HH:mm:ss
     */
    public static String getTimeFormat(Date date) {
        return timeFormat.format(date);
    }

    /**
     * 日期格式化
     *
     * @param date
     * @param 格式类型
     * @return
     */
    public static String getDateFormat(Date date, String formatStr) {
        if (StringUtils.isNotBlank(formatStr)) {
            return new SimpleDateFormat(formatStr).format(date);
        }
        return null;
    }

    /**
     * 日期格式化
     *
     * @param date
     * @return
     */
    public static Date getDateFormat(String date) {
        try {
            return dateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 时间格式化
     *
     * @param date
     * @return
     */
    public static Date getDateTimeFormat(String date) {
        try {
            return dateTimeFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取当前日期(yyyy-MM-dd)
     *
     * @param
     * @return
     */
    public static Date getNowDate() {
        return DateUtil.getDateFormat(dateFormat.format(new Date()));
    }

    /**
     * 获取当前日期星期一日期
     *
     * @return date
     */
    public static Date getFirstDayOfWeek() {
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek()); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前日期星期日日期
     *
     * @return date
     */
    public static Date getLastDayOfWeek() {
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期星期一日期
     *
     * @param date
     * @return date
     */
    public static Date getFirstDayOfWeek(Date date) {
        if (date == null) {
            return null;
        }
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek()); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期星期一日期
     *
     * @param date
     * @return date
     */
    public static Date getLastDayOfWeek(Date date) {
        if (date == null) {
            return null;
        }
        gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_WEEK, gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前月的第一天
     *
     * @return date
     */
    public static Date getFirstDayOfMonth() {
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前月的最后一天
     *
     * @return
     */
    public static Date getLastDayOfMonth() {
        gregorianCalendar.setTime(new Date());
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        gregorianCalendar.add(Calendar.MONTH, 1);
        gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取指定月的第一天
     *
     * @param date
     * @return
     */
    public static Date getFirstDayOfMonth(Date date) {
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取指定月的最后一天
     *
     * @param date
     * @return
     */
    public static Date getLastDayOfMonth(Date date) {
        gregorianCalendar.setTime(date);
        gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
        gregorianCalendar.add(Calendar.MONTH, 1);
        gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期前一天
     *
     * @param date
     * @return
     */
    public static Date getDayBefore(Date date) {
        gregorianCalendar.setTime(date);
        int day = gregorianCalendar.get(Calendar.DATE);
        gregorianCalendar.set(Calendar.DATE, day - 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取日期后一天
     *
     * @param date
     * @return
     */
    public static Date getDayAfter(Date date) {
        gregorianCalendar.setTime(date);
        int day = gregorianCalendar.get(Calendar.DATE);
        gregorianCalendar.set(Calendar.DATE, day + 1);
        return gregorianCalendar.getTime();
    }

    /**
     * 获取当前年
     *
     * @return
     */
    public static int getNowYear() {
        Calendar d = Calendar.getInstance();
        return d.get(Calendar.YEAR);
    }

    /**
     * 获取当前月份
     *
     * @return
     */
    public static int getNowMonth() {
        Calendar d = Calendar.getInstance();
        return d.get(Calendar.MONTH) + 1;
    }

    /**
     * 获取当月天数
     *
     * @return
     */
    public static int getNowMonthDay() {
        Calendar d = Calendar.getInstance();
        return d.getActualMaximum(Calendar.DATE);
    }

    /**
     * 获取时间段的每一天
     *
     * @param startDate
     * @param endDate
     * @return 日期列表
     */
    public static String[] getEveryDay(String startDate, String endDate) {
        if (startDate == null || endDate == null) {
            return null;
        }
        Date start_date =  DateUtil.formatDate(startDate,"yyyy-MM-dd");
        Date end_date =  DateUtil.formatDate(endDate,"yyyy-MM-dd");
        List<String> everyDays = new ArrayList<String>();
        gregorianCalendar.setTime(start_date);
        everyDays.add(DateUtil.getDateFormat(gregorianCalendar.getTime()));
        while (gregorianCalendar.getTime().compareTo(end_date) < 0) {
            // 加1天
            gregorianCalendar.add(Calendar.DAY_OF_MONTH, 1);
            everyDays.add(DateUtil.getDateFormat(gregorianCalendar.getTime()));
        }
        return (String[])everyDays.toArray(new String[everyDays.size()]);
    }

    /**
     * 获取提前多少个月
     *
     * @param month
     * @return
     */
    public static Date getFirstMonth(int monty) {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, -monty);
        return c.getTime();
    }
}


数据格式化

public class LineDataUtil {
    private List<String> categories = new ArrayList<String>();
    private List<String> labels = new ArrayList<String>();
    private List<Object[]> vals = new ArrayList<Object[]>();
    //折柱
    private List<double[]> lineVals = new ArrayList<double[]>();


    public LineDataUtil(){}

    public List<String> getCategories() {
        return categories;
    }

    public void addCategory(String category) {
        this.categories.add(category);
    }


    public List<String> getLabels() {
        return labels;
    }


    public void addLabel(String label) {
        this.labels.add(label);
    }

    public List<Object[]> getVals() {
        return vals;
    }

    public void addValList(Object[] vals) {
        this.vals.add(vals);
    }

    public void addValList(int rowIndex, int clmnIndex, Object[] vals) {
        this.vals.add(vals);
    }

    public List<double[]> getLineVals() {
        return lineVals;
    }

    public void addLineVals(double[] lineVals) {
        this.lineVals.add(lineVals);
    }

    public void addLineVals(int rowIndex, int clmnIndex, double[] lineVals) {
        this.lineVals.add(lineVals);
    }

来自一只刚入的小菜鸟,希望大神看到多多指点。

猜你喜欢

转载自blog.csdn.net/weixin_43474476/article/details/100556723