ECharts折线图实现(前端、后端、数据结构)

ECharts简介

ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9 /10/11,chrome,firefox,Safari等),底层依赖轻量级的Canvas类库ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

支持折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)、雷达图(填充雷达 图)、和弦图、力导向布局图、地图、仪表盘、漏斗图、事件河流图等12类图表,同时提供标题,详情气泡、图例、值域、数据区域、时间轴、工具箱等7个可交 互组件,支持多图表、组件的联动和混搭展现。

使用场景

在项目中,根据用户选择的信息展示对应的折线图,折线图不是在一个ECharts上展示的,一个信息只占用一个ECharts

在这里插入图片描述

实现步骤

1、引入Echarts并且绘制一个简单的图表(html)

<script  src="js/echarts.js"></script>

<div id="main" style="min-width: 500px; height: 500px; max-width: 1500px; margin:50px auto;"></div>

2、创建一个折线图(js)

var option;
function dataHisEcharts(dataList){
    console.log(dataList);
    var series  = [];
    var names=[];
    $("#main").empty();// 清空div内容
    for (var key in dataList) {
        var datas = dataList[key];
        var tagValue=[];
        names = [];//将要展示的名字集合清空
        if (key != 'time') {// 如果数据为x轴,就不再创建div
            $("#main").append("<div id='main" + key + "' style='min-width: 500px; height: 500px; max-width: 1500px; margin:50px auto;'></div>");
        }
        var myChart = echarts.init(document.getElementById('main'+key));
        for (var i = 0; i < datas.length; i++) {
            if(datas[i]!=null&&datas[i]!=undefined&&datas[i]!=""){
                tagValue.push(datas[i]);
            }
        }
        if (key != 'time') {
            var Item = {
                name: key,
                type: 'line',
                data: tagValue
            };
            series = [];// 将数组清空
            series.push(Item);
            names.push(key);
        }

        option = {
            title: {
                text: ''+key+'监控属性趋势曲线'
            },
            legend: {
                top:"6%",
                data: names,
            },
            tooltip: {
                trigger: 'axis',
                formatter: function (params, ticket, callback) {
                    var htmlStr = '';
                    for(var i=0;i<params.length;i++){
                        var param = params[i];
                        var xName = param.name;//x轴的名称
                        var seriesName = param.seriesName;//图例名称
                        var value = param.value;//y轴值
                        var color = param.color;//图例颜色
                        if(i===0){
                            htmlStr += xName + '<br/>';//x轴的名称
                            htmlStr +='<div>';
                            htmlStr += '<span style="margin-top:5px;float:left;width:12px;height:12px;border-radius:50%;background-color:'+color+';display: block"></span>&nbsp;';
                            htmlStr += seriesName + ':' + value;
                        }else{
                            htmlStr +='<div>';
                            //为了保证和原来的效果一样,这里自己实现了一个点的效果
                            htmlStr += '<span style="margin-top:5px;float:left;width:12px;height:12px;border-radius:50%;background-color:'+color+';display: block"></span>&nbsp;';
                            //圆点后面显示的文本
                            htmlStr += seriesName + ':' + value;
                        }
                        if(seriesName.indexOf("体积总量")!=-1){
                            htmlStr += 'm³';
                        }else if(seriesName.indexOf("体积流量")!=-1){
                            htmlStr += 'm³/h';
                        }else if(seriesName.indexOf("压力")!=-1){
                            htmlStr += 'KPa';
                        }else if(seriesName.indexOf("温度")!=-1){
                            htmlStr += '℃';
                        }
                        htmlStr += '</div>';
                    }
                    return htmlStr;
                }
            },
            grid: {
                top:'30%',
                left: '8%',
                right: '8%',
                bottom: '5%',
                containLabel: true
            },
            xAxis: {
                data: dataList["time"],
                boundaryGap: false
            },
            yAxis: {
            },
            series: []
        };
        option.series = series; // 设置图表
        myChart.clear();
        myChart.setOption(option, true);// 使用刚指定的配置项和数据显示图表。
    }
}

3、了解ECharts需要的数据结构

ECharts需要的数据结构是x,y格式的,要在后台将数据装换成下图这种格式返回给ECharts
在这里插入图片描述

4、后台将数据整合返回给ECharts

后台的代码实现方式有很多种,在此仅提供一个参考的方法
在这里插入图片描述

public Map<String, String[]> getPointHistorical(List<findTiaoJian> dataList) {
        // 最终返回的集合
        Map<String, String[]> map = new HashMap<>();
        // 返回的时间的集合
        String[] times = new String[dataList.size()];
        String[] strings;
        List<String> datetimeList = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            // 存储时间
            String dates = dataList.get(i).getTime();
            times[i] = dates;
            if (!datetimeList.contains(times[i])) {
                datetimeList.add(times[i]);
            }
        }
        // 将y轴数据存入map
        Map<String, List<findTiaoJian>> PointDataMapByName = dataList.stream().collect(Collectors.groupingBy(findTiaoJian::getPoint_name));
        for (Map.Entry<String, List<findTiaoJian>> stringListEntry : PointDataMapByName.entrySet()) {
            String tagName = stringListEntry.getKey();
            map.put(tagName, getTagVlaues(datetimeList, dataList, tagName));

        }
        strings = datetimeList.toArray(new String[datetimeList.size()]);
        // 将x轴数据存入map
        map.put("time", strings);
        return map;
    }
    /**
    * 存储y轴参数
    **/
    public String[] getTagVlaues(List<String> datetimeList, List<findTiaoJian> dataList, String tagName) {
        String[] values = new String[dataList.size()];
        for (int i = 0; i < datetimeList.size (); i++) {
            String datetimeStr = datetimeList.get(i);
            findTiaoJian pointData = dataList.stream().filter(data -> datetimeStr.equals(data.getTime())
                    && tagName.equals(data.getPoint_name())).findFirst().orElse(null);
            if(pointData != null){
                String value = new BigDecimal(pointData.getValue()).setScale(4, BigDecimal.ROUND_DOWN).stripTrailingZeros().toPlainString();
                values[i] = value;
            }else{
                values[i] = "0";
            }
        }
        return values;
    }

5、效果图

在这里插入图片描述

梦想也许在今天无法实现,但重要的是,它在你心里。重要的是,你一直在努力,加油!!!

  • 14
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
为了在Java后端实现ECharts折线图,您需要遵循以下步骤: 1.首先,您需要在Java项目中引入ECharts库。您可以从以下链接下载ECharts-2.2.7.jar文件:http://mvnrepository.com/artifact/com.github.abel533/ECharts 2.接下来,您需要在前端使用ECharts.js。您可以从以下链接下载ECharts.js文件:http://echarts.baidu.com/echarts2/ 3.在Java代码中,您需要使用ECharts库提供的类来创建图表。以下是一个简单的示例代码,用于创建一个折线图: ```java import com.github.abel533.echarts.Option; import com.github.abel533.echarts.axis.CategoryAxis; import com.github.abel533.echarts.axis.ValueAxis; import com.github.abel533.echarts.code.AxisType; import com.github.abel533.echarts.code.LineType; import com.github.abel533.echarts.series.Line; import com.github.abel533.echarts.series.Series; public class EChartsLineChart { public Option getLineChart() { // 创建Option对象 Option option = new Option(); // 设置图表标题 option.title().text("折线图"); // 设置图表工具栏 option.toolbox().show(true); // 设置图表图例 option.legend().data("数据1", "数据2"); // 设置X CategoryAxis xAxis = new CategoryAxis(); xAxis.type(AxisType.category); xAxis.data("一月", "二月", "三月", "四月", "五月", "六月"); option.xAxis(xAxis); // 设置Y ValueAxis yAxis = new ValueAxis(); yAxis.type(AxisType.value); option.yAxis(yAxis); // 添加数据系列 Line line1 = new Line(); line1.name("数据1"); line1.type(Series.Type.line); line1.data(10, 20, 30, 40, 50, 60); Line line2 = new Line(); line2.name("数据2"); line2.type(Series.Type.line); line2.data(20, 30, 40, 50, 60, 70); option.series(line1, line2); return option; } } ``` 4.在您的Java代码中,您需要将数据整合到Option对象中,并将其返回给前端。以下是一个简单的示例代码: ```java import com.github.abel533.echarts.Option; import com.github.abel533.echarts.json.GsonOption; public class EChartsController { public String getLineChartData() { // 创建ECharts折线图对象 EChartsLineChart lineChart = new EChartsLineChart(); // 获取Option对象 Option option = lineChart.getLineChart(); // 将Option对象转换为JSON字符串 GsonOption gsonOption = new GsonOption(); gsonOption.setOption(option); String json = gsonOption.toString(); // 返回JSON字符串 return json; } } ``` 5.最后,在前端代码中,您需要使用Ajax从后端获取数据,并使用ECharts.js将数据渲染为折线图。以下是一个简单的示例代码: ```javascript $.ajax({ url: "/getLineChartData", type: "GET", dataType: "json", success: function (data) { // 使用ECharts.js将数据渲染为折线图 var myChart = echarts.init(document.getElementById("lineChart")); myChart.setOption(data); } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值