ajax+echarts实现数据可视化

在项目开发中,我们往往会有将数据可视化展现的功能,于是学会echarts的使用就成为了一件刻不容缓的事情。在echarts官网的实例中,可以大概知道echarts有两种方法实现图表,首先是通过ajax和后台实现jsonarray以及jsonobject等类型的传输,具体传输格式需要参考ehcarts中的示例代码,另外一种方法则是生成.json文件,通过在前端用$.get获取文件中的json数据。其实两种方法内在的实现都基本一样,都是前端得到json数据的过程。所以这里就主要讲讲第一种方法的前后台具体实现。

一、首先举一个最简单的例子—— 一个简单的饼状图【链接】。

这里面有两组数据:

1、第一个为

 data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
可以知道在jsonarray中放了五个字符串,在后台用一个jsonarray拿到这五个字符串就可以直接搞定。效果如下



2、第二个为

data:[
                {value:335, name:'直接访问'},
                {value:310, name:'邮件营销'},
                {value:234, name:'联盟广告'},
                {value:135, name:'视频广告'},
                {value:1548, name:'搜索引擎'}
            ]

是在一个jsonarray放了五个jsonobject。在jsonarray分别add五个已经加了不同的value和name属性的jsonobject,即可实现,效果如下。


具体实现传值需要用ajax,实现如下(我们返回了一个jsonarray,第一个存的是第一组数据,第二个存的是第二组数据)

<div id="main" style="width: 700px;height:400px;"></div><%--<td >设置当前显示图表的模块,id应init中一致</td>--%>
  <script type="text/javascript">
                //数据纯属虚构
                var myChart = echarts.init(document.getElementById('main'));
 $.ajax({
                    type : "post",
                    async : true,            //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
                    url : "Servlet3",    //请求发送到相应的servlet
                    dataType : "json",        //返回数据形式为json
                    success : function(data) {
                        //请求成功时执行该函数内容,result即为服务器返回的json对象
                        if (data) {
option = {
    tooltip: {
        trigger: 'item',
        formatter: "{a} <br/>{b}: {c} ({d}%)"
    },
    legend: {
        orient: 'vertical',
        x: 'left',
        data:data[0]
//返回的jsonarray中的第一组数据
},  series: [
        {
            name             :'访问来源',
            type             :'pie',
            radius           : ['50%', '70%'],
            avoidLabelOverlap: false,
            label            : {
            normal           : {
            show             : false,
            position         : 'center'
                },
                emphasis: {
                    show: true,
                    textStyle: {
                        fontSize: '30',
                        fontWeight: 'bold'
                    }
                }
            },
            labelLine: {
                normal: {
                    show: false
                }
            },
            data:data[1]
        }
    ]
};} }, 
error : function(errorMsg) { 
//没做出错处理 //请求失败时执行该函数 alert("图表请求数据失败!"); 
} 
})
</script>
二、然后是一个比较常用的的例子—— 一个比较基础的地图【链接】。
这个里面需要一组data如下
var data = [{
        name: '北京',
        value: 5.3
    },
    {
        name: '天津',
        value: 3.8
    },
    {
        name: '上海',
        value: 4.6
    },
    {
        name: '重庆',
        value: 3.6
    },
    {
        name: '河北',
        value: 3.4
    },
    {
        name: '河南',
        value: 3.2
    },
    {
        name: '云南',
        value: 1.6
    },
    {
        name: '辽宁',
        value: 4.3
    },
    {
        name: '黑龙江',
        value: 4.1
    },
    {
        name: '湖南',
        value: 2.4
    },
    {
        name: '安徽',
        value: 3.3
    },
    {
        name: '山东',
        value: 3.0
    },
    {
        name: '新疆',
        value: 1
    },
    {
        name: '江苏',
        value: 3.9
    },
    {
        name: '浙江',
        value: 3.5
    },
    {
        name: '江西',
        value: 2.0
    },
    {
        name: '湖北',
        value: 2.1
    },
    {
        name: '广西',
        value: 3.0
    },
    {
        name: '甘肃',
        value: 1.2
    },
    {
        name: '山西',
        value: 3.2
    },
    {
        name: '内蒙古',
        value: 3.5
    },
    {
        name: '陕西',
        value: 2.5
    },
    {
        name: '吉林',
        value: 4.5
    },
    {
        name: '福建',
        value: 2.8
    },
    {
        name: '贵州',
        value: 1.8
    },
    {
        name: '广东',
        value: 3.7
    },
    {
        name: '青海',
        value: 0.6
    },
    {
        name: '西藏',
        value: 0.4
    },
    {
        name: '四川',
        value: 3.3
    },
    {
        name: '宁夏',
        value: 0.8
    },
    {
        name: '海南',
        value: 1.9
    },
    {
        name: '台湾',
        value: 0.1
    },
    {
        name: '香港',
        value: 0.1
    },
    {
        name: '澳门',
        value: 0.1
    }
];

可以看出传来的数据为一个jsonarray中嵌套了多个jsonobject。在这个例子中不用把所有的地名写出来,只用写有变化的那几个就ok,其他地区的数据默认为零,最终前端代码如下:

<div class="info_head">
                    <h4>对外投资分布图</h4>
                    <div id="main1" style="width: 700px;height:400px;"></div>
                </div>
            </div>


            <script type="text/javascript">
                //数据纯属虚构
                var myChart = echarts.init(document.getElementById('main1'));
                //数据纯属虚构
                $.ajax({
                    type : "post",
                    async : true,            //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
                    url : "Servlet3",    //请求发送到相应的servlet
                    dataType : "json",        //返回数据形式为json
                    success : function(data) {
                        //请求成功时执行该函数内容,result即为服务器返回的json对象
                        if (data) {

                            // alert(data);

                            var yData = [];

                            data.sort(function(o1, o2) {
                                if (isNaN(o1.value) || o1.value == null) return -1;
                                if (isNaN(o2.value) || o2.value == null) return 1;
                                return o1.value - o2.value;
                            });

                            for (var i = 0; i < data.length; i++) {
                                yData.push(data[i].name);
                            }

                            var option = {
                                title: {
                                    text: '',
                                    textStyle: {
                                        fontSize: 30
                                    },
                                    x: 'center'
                                },
                                tooltip: {
                                    show: true,
                                    formatter: function(params) {
                                        return params.name + ':' + params.data['value'] + '%'
                                    },
                                },
                                visualMap: {
                                    type: 'continuous',
                                    text: ['', ''],
                                    showLabel: true,
                                    seriesIndex: [0],
                                    min: 0,
                                    max: 7,
                                    inRange: {
                                        color: ['#edfbfb', '#b7d6f3', '#40a9ed', '#3598c1', '#215096', ]
                                    },
                                    textStyle: {
                                        color: '#000'
                                    },
                                    bottom: 30,
                                    left: 'left',
                                },
                                grid: {
                                    right: 10,
                                    top: 80,
                                    bottom: 30,
                                    width: '20%'
                                },
                                xAxis: {
                                    type: 'value',
                                    scale: true,
                                    position: 'top',
                                    splitNumber: 1,
                                    boundaryGap: false,
                                    splitLine: {
                                        show: false
                                    },
                                    axisLine: {
                                        show: false
                                    },
                                    axisTick: {
                                        show: false
                                    },
                                    axisLabel: {
                                        margin: 2,
                                        textStyle: {
                                            color: '#aaa'
                                        }
                                    }
                                },
                                yAxis: {
                                    type: 'category',
                                    nameGap: 16,
                                    axisLine: {
                                        show: false,
                                        lineStyle: {
                                            color: '#ddd'
                                        }
                                    },
                                    axisTick: {
                                        show: false,
                                        lineStyle: {
                                            color: '#ddd'
                                        }
                                    },
                                    axisLabel: {
                                        interval: 0,
                                        textStyle: {
                                            color: '#999'
                                        }
                                    },
                                    data: yData
                                },
                                geo: {
                                    roam: true,
                                    map: 'china',
                                    left: 'left',
                                    right:'300',
                                    layoutSize: '80%',
                                    label: {
                                        emphasis: {
                                            show: false
                                        }
                                    },
                                    itemStyle: {
                                        emphasis: {
                                            areaColor: '#fff464'
                                        }
                                    },
                                    regions: [{
                                        name: '南海诸岛',
                                        value: 0,
                                        itemStyle: {
                                            normal: {
                                                opacity: 0,
                                                label: {
                                                    show: false
                                                }
                                            }
                                        }
                                    }],
                                },
                                series: [{
                                    name: 'mapSer',
                                    type: 'map',
                                    roam: false,
                                    geoIndex: 0,
                                    label: {
                                        show: false,
                                    },
                                    data: data
                                }, {
                                    name: 'barSer',
                                    type: 'bar',
                                    roam: false,
                                    visualMap: false,
                                    zlevel: 2,
                                    barMaxWidth: 20,
                                    itemStyle: {
                                        normal: {
                                            color: '#40a9ed'
                                        },
                                        emphasis: {
                                            color: "#3596c0"
                                        }
                                    },
                                    label: {
                                        normal: {
                                            show: false,
                                            position: 'right',
                                            offset: [0, 10]
                                        },
                                        emphasis: {
                                            show: true,
                                            position: 'right',
                                            offset: [10, 0]
                                        }
                                    },
                                    data: data
                                }]
                            };

                            myChart.setOption(option);
                            // myChart1.showLoading();
                        }
                    },
                    error : function(errorMsg) { //没做出错处理
                        //请求失败时执行该函数
                        alert("图表请求数据失败!");
                        myChart2.hideLoading();
                    }
                })
ydata部分为右边栏的部分,在这里用了
yData.push(data[i].name);
将传过来的省份名字传到ydata项。


提示:

1、在echarts网站上可以实时改代码,可以自己修改代码中的一些参数(颜色、形状、大小等等)来达到自己想要的效果。

2、在使用echarts需要导入它的js到项目中比较常用的例如:

<script src="http://echarts.baidu.com/dist/echarts.min.js"></script>

具体见官方文档:点击打开链接

3、在js中创建实例时(echarts.init)一定要避免容器id重复,不然重复的话图就不会出来。


注:(之后还会补充其他类型echart的使用方法,其实最好学习的方法还是看官方文档,本文也是基于官方文档给出自己的具体运用)

猜你喜欢

转载自blog.csdn.net/qq_38440882/article/details/80954633