利用echarts对pm2.5数据进行可视化处理

echarts是百度提供的数据可视化js插件,功能强大,提供各种基本的图表(尤其世界以及中国各种地图,方便时空数据的可视化);具体看参考http://echarts.baidu.com/ 。

本文主要尝试了四个功能

1.      鼠标放在地图某个区上时显示该区在所给数据的时间段内各中类型天气(优、良、轻度、中度、重度、严重污染)的天数

2.      鼠标点击某个区,在下方的曲线图中,显示该区每天的天气质量情况。

3.      鼠标点击某个区后显示该区域每天二十四个小时每个小时重度污染的天数(对污染情况按照每天的24个小时为变量进行统计,观察污染情况与时间段的关系)

4.      饼图显示对pm2.5的各种因素的影响权重。  

截图如下:


实现过程非常简单,只要熟悉下百度提供的doc就可以做出来。

稍微有点思考的地方:  将使用的各种不同的图标的实例放在一个<javascript>中,这样就可以通过全局变量的交互实现不同图表的交互;本次试验中曲线图的option就是放在地图的点击相应事件中的。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
	<script type="text/javascript" src="/js/echarts/echarts-plain-map.js"></script>
	<script src="/js/echarts/jquery.js"> </script>
</head>
<body>
        <div position="left">                                
                    <hr>                   
                    <div class='content' >
                        <input name='showtype' class="content" id='id1' type='radio'  /><label for='mapBox'>具体污染情况</label>
						<input id='id2' type='radio'  name='showtype'></input><label for='mapBox'>每天内时间段污染情况统计</label>             
						<input id='id3' type='radio'  name='showtype'></input><label for='mapBox'>每周内污染情况统计</label>
						<input id='id4' type='radio'  name='showtype' onclick="click1()" ></input><label for='mapdBox'>PM2.5影响因子分析</label>
                    </div>
                    <hr>                              
        </div>
 <div style="display:float">
	<div id="main" style="height:400px;width:700px;float:left"  >		
	</div>
	<div id="main3" style="height:400px;width:500px;float:right" >		
	</div>
</div>	
	<div id="main2" style="height:400px" >
	
	</div>
</body>

<script type="text/javascript">
	var url1;
	var url2;
	var url3;  // the three urls for three diff data	
	{// TODO :  data for 18 section and 21 days for every section; 18*21  in total 
	//var dataDay 		= new Array();
	//var dataHour		= new Array();  //: 18*24 
	//var dataSuspension	= new Array();   // data for the mouse on the section and the tooltip;  18*6 //重度污染 中度 轻度污染; 正常;四种天数的统计
	//for(var t=0;t<18*21;t++){
		//data.push(t);
	//}
	//for(var t=0;t<18*24;t++){
	//	dataHour.push(t);
	//}
	//for(var t=0;t<18*7;t++){
		//dataDay.push(t);
	//}   
	//for(var t=0;t<18*4;t++){
		//dataSuspension.push(t);
	//} 
// TODO :these initialization just for test ;  deleted  when use
	}
	var functionType 	= 1; // 1,2,3 corresponding to three different functions 	
	var sectionName		=[ '朝阳区', '昌平区',    '大兴区','东城区', '石景山区', '怀柔区',
				'房山区', '门头沟区','密云县','宣武区', '平谷区', '顺义区',  '崇文区' ,'通州区', 
				'海淀区', '西城区','延庆县','丰台区'];
	// use a array store the name and related with the data 	
	
	var myChart1 = echarts.init(document.getElementById('main'));
	var myChart2 = echarts.init(document.getElementById('main2'));
	var myChart3 = echarts.init(document.getElementById('main3'));
	// store the data for 曲线图
	// for radio 1	
	$(document).ready(function(){
		$("#id1").click(function(){
		//	$.get(url1,function(data,status){
				functionType=1;
				 //maybe this interactive function no use  			  
		//	});
		});
	});
	
	$(document).ready(function(){
		$("#id2").click(function(){
		//	$.get(url2,function(data,status){				
				 functionType=2;
				// TODO 
				//get dataHour;
		//	});
		});
	});
	
	$(document).ready(function(){
		$("#id3").click(function(){
		//	$.get(url3,function(data,status){
				functionType=3;
				// TODO 
				//get dataDay
		//	});
		});
	});
	//
	
// 北京市地图	
var option1	={
    title : {
        text: '北京市PM2.5',
        x:'center'
    },
	 tooltip : {
	    trigger: 'item',
        showDelay: 0,
        hideDelay: 50,
        transitionDuration:0,
        backgroundColor : 'rgba(255,0,255,0.7)',
        borderColor : '#f50',
        borderRadius : 8,
        borderWidth: 2,
        padding: 10,    // [5, 10, 15, 20]
        textStyle : {
            color: 'yellow',
            decoration: 'none',
            fontFamily: 'Verdana, sans-serif',
            fontSize: 15,
            fontStyle: 'italic',
            fontWeight: 'bold'
        },
        formatter: function(params,ticket,callback){
			//alert("tste");
			var sectionTemp = params[1]; 
			var res = sectionTemp+'<br/>';
			//alert(sectionTemp);
			for(var i=0;i<sectionName.length;i++){
			//	alert(sectionTemp+'....'+ sectionName[i]);
				if(sectionTemp == sectionName[i]){
	//				alert('get the section'+sectionName[i]);
					res = res +'空气质量优:' +dataSuspension[i*6]+'<br/>'+'空气质量良:'+dataSuspension[i*6+1]+'<br/>'+'轻度污染:'+dataSuspension[i*6+2]+'<br/>'
					+'中度污染:'+dataSuspension[i*6+3]+'<br/>'+'重度污染:'+dataSuspension[i*6+4]+'<br/>'+'严重污染:'+dataSuspension[i*6+5]+'<br/>';
				}
			};
			//alert(ticket);
            setTimeout(function(){
                callback(ticket,res);
            }, 1000)
            return 'DataLoading';
        }
    },
    toolbox: {
        show : true,
        orient : 'vertical',
        x: 'right',
        y: 'center',
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
	
	
    series : [
        {
			 
            name: '重度污染',
            type: 'map',
            mapType: '北京',
			selectedMode : 'single',
			//roam: true,
            itemStyle:{
                emphasis:{label:{show:true}}
            },
            data:[
			    {name: '朝阳区',selected:false},
                {name: '昌平区',selected:false},
                {name: '大兴区',selected:false},
                {name: '东城区',selected:false},
                {name: '石景山区',selected:false},
                {name: '怀柔区',selected:false},
				{name: '房山区',selected:false},
                {name: '门头沟区',selected:false},
                {name: '密云县',selected:false},
				{name: '宣武区',selected:false},
                {name: '平谷区',selected:false},
                {name: '顺义区',selected:false},
                {name: '崇文区',selected:false},
                {name: '通州区',selected:false},
                {name: '海淀区',selected:false},
                {name: '西城区',selected:false},
                {name: '延庆县',selected:false},
                {name: '丰台区',selected:false},
            ]
        }
    ],
	//animation: false
};                   

myChart1.on(echarts.config.EVENT.MAP_SELECTED, function(param){
	//alert("test");
	var selectedIndex = -1; // corresponding to sectionName
    var selected = param.selected;
    var name;
    for (var i = 0, l = option1.series[0].data.length; i < l; i++) {
        name = option1.series[0].data[i].name;
        option1.series[0].data[i].selected = selected[name];
        if (selected[name]) {
			selectedIndex = i;
        }
    }	
	//alert(selectedSection);   // get the section index and correspond to 'sectionName'
	
	var option2;
	switch(functionType){
	case 1:
		var dataTemp = data.slice(selectedIndex*21,selectedIndex*21+21); //data for echart2 
			// the pm data date from 20140107-20140127  
		option2 = {
			title : {
				text: sectionName[selectedIndex]+'每天污染情况',
				x:'left'
			},
			tooltip : {
				trigger: 'axis'
			},
			legend: {
				data:['重度污染']
			},
			toolbox: {
				show : true,
				feature : {
				mark : {show: true},
				dataZoom : {show: true},
				dataView : {show: true},
				magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
				restore : {show: true},
				saveAsImage : {show: true}
				}
			},
			calculable : true,
			dataZoom : {
				show : true,
				realtime : true,
				start : 20,
				end : 80
			},
			xAxis : [
				{
				type : 'category',
				boundaryGap : false,
				data : function(){
					var list = [];
					for (var i = 7; i <= 27; i++) {
						list.push('2014-01-' + i);
					}
					return list;
				}()
				}
			],
			yAxis : [
				{
					type : 'value',
					splitArea : {show : true}
				}
			],
			series : [
				{
				name:'重度污染',
				type:'line',
				data:function(){
					var list = [];
					for (var i = 7; i <= 27; i++) {
					//TODO:  transmit the data to the list 
						list.push(dataTemp[i-7]);
					}
					return list;
				}()
				}		
			]
		};
			break;
	case 2:
		var dataTemp = dataHour.slice(selectedIndex*24,selectedIndex*24+24); //data for echart2 
			// the pm data date from 20140107-20140127  
		option2 = {
			title : {
				text: sectionName[selectedIndex]+'一天中每个小时段的污染统计(天)',
				x:'left'
			},
			tooltip : {
				trigger: 'axis'
			},
			legend: {
				data:['重度污染']
			},
			toolbox: {
				show : true,
				feature : {
				mark : {show: true},
				dataZoom : {show: true},
				dataView : {show: true},
				magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
				restore : {show: true},
				saveAsImage : {show: true}
				}
			},
			calculable : true,
			dataZoom : {
				show : true,
				realtime : true,
				start : 20,
				end : 80
			},
			xAxis : [
				{
				type : 'category',
				boundaryGap : false,
				data : function(){
					var list = [];
					for (var i = 0; i <= 23; i++) {
						list.push(i+':00');
					}
					return list;
				}()
				}
			],
			yAxis : [
				{
					type : 'value',
					splitArea : {show : true}
				}
			],
			series : [
				{
				name:'重度污染',
				type:'line',
				data:function(){
					var list = [];
					for (var i = 0; i <= 23; i++) {
					//TODO:  transmit the data to the list 
						list.push(dataTemp[i]);
					}
					return list;
				}()
				}		
			]
		};
			break;
	case 3:
		var dataTemp = dataDay.slice(selectedIndex*7,selectedIndex*7+7); //data for echart2 
		option2 = {
			title : {
				text: sectionName[selectedIndex]+'一个星期中每天的污染统计(天)',
				x:'left'
			},
			tooltip : {
				trigger: 'axis'
			},
			legend: {
				data:['重度污染']
			},
			toolbox: {
				show : true,
				feature : {
				mark : {show: true},
				dataZoom : {show: true},
				dataView : {show: true},
				magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
				restore : {show: true},
				saveAsImage : {show: true}
				}
			},
			calculable : true,
			dataZoom : {
				show : true,
				realtime : true,
				start : 20,
				end : 80
			},
			xAxis : [
				{
				type : 'category',
				boundaryGap : false,
				data : function(){
					var list = ["星期一","星期二","星期三","星期四","星期五","星期六","星期日",];
					return list;
				}()
				}
			],
			yAxis : [
				{
					type : 'value',
					splitArea : {show : true}
				}
			],
			series : [
				{
				name:'重度污染',
				type:'line',
				data:function(){
					var list = [];
					for (var i = 0; i <= 7; i++) {
					//TODO:  transmit the data to the list 
						list.push(dataTemp[i]);
					}
					return list;
				}()
				}		
			]
		};
			break;
	}
	
	myChart2.setOption(option2);   //display 
});

myChart1.setOption(option1);
 
// pm2.5影响因子分析 
var option3 = {
    title : {
        text: 'PM2.5影响因子分析',
        x:'center'
    },
    tooltip : {
        trigger: 'item',
        formatter: "{a} <br/>{b} : {c} ({d}%)"
    },
    legend: {
        orient : 'vertical',
        x : 'left',
        data:['风速','降雨','温度']
    },
    toolbox: {
        show : true,
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
    calculable : true,
    series : [
        {
            name:'访问来源',
            type:'pie',
            radius: '55%',
            center: ['50%', 225],
            data:[
                {value:335, name:'风速'},
                {value:310, name:'降雨'},
                {value:234, name:'温度'}
            ]
        }
    ]
};
          
function click1() {
	myChart3.setOption(option3);
}

</script>
</html>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章