Echart繪制趨勢圖和柱狀圖總結


1.legend名字與series名字一樣,即可聯動,且不可手動去掉聯動效果


2.通過legend圖例聯動,隱藏繪制圖線后,對應( yAxisIndex: 1)坐標y軸如果沒有同時設置min和max的情況下,會自動隱藏。


3.grid可以通過設置x、y等為百分比達到自適應效果。


4.隱藏部分圖線時,tooltip顯示有格式要求時,通過給tooltip的formatter傳遞函數處理。

 

echart繪制圖線實現代碼:

  1 var modalChart = null;
  2 
  3 function createModalTrend(convertedData) {
  4     if(convertedData && convertedData[0] && convertedData[1] && convertedData[2]){
  5         //有數據情況下
  6         $("#serviceTrendChart").attr('class','box');
  7         var modalOption = {
  8             legend:{
  9                 orient:'horizontal',
 10                 show:true,
 11                 x:'center',
 12                 y:'bottom',
 13                 data: ['數','率']
 14             },
 15             title:{
 16                 x:'center',
 17                 show:true,
 18                 text:'' ,
 19                 textAlign:'center',
 20                 textStyle:{
 21                     fontSize:14
 22                 }
 23             },
 24             backgroundColor: '#ffffff',
 25             tooltip: {
 26                 formatter: function (params,ticket,callback) {
 27 
 28                     var res = params[0].name + '<br>';
 29                     for (var i = 0; i < params.length;  i++) {
 30                         if(params[i].seriesName == '數'){
 31                             res += "數:" + params[i].value + '<br>';
 32                         }
 33                         if(params[i].seriesName == '率'){
 34                             res += "率:" + params[i].value + '%<br>';
 35                         }
 36                     }
 37                     return res;
 38                 },
 39                 trigger: 'axis',
 40                 backgroundColor: 'rgba(250,250,250,0.7)',// 懸浮框的顏色
 41                 axisPointer: {            // 坐標軸指示器,坐標軸觸發有效
 42                     type: 'line',         // 默認為直線,可選為:'line' | 'shadow'
 43                     lineStyle: {          // 直線指示器樣式設置
 44                         color: '#D6D7D7',// 縱向豎虛線的顏色
 45                         type: 'dashed'
 46                     },
 47                     crossStyle: {
 48                         color: 'rgba(250,190,31,0.7)'
 49                     },
 50                     shadowStyle: {                     // 陰影指示器樣式設置
 51                         color: 'rgba(250,190,31,0.7)'
 52                     }
 53                 },
 54                 textStyle: {
 55                     color: 'rgba(0,0,0,0.7)'// 懸浮框內容的顏色
 56                 }
 57             },
 58             //  calculable: false,
 59             grid: {
 60                 x:'10%',
 61                 y: '18%',
 62                 x2:'10%',
 63                 y2:'28%',
 64                 borderWidth: 1,
 65                 borderColor: '#D6D7D7'
 66             },
 67             xAxis: [
 68                 {
 69 
 70                     axisLabel: {
 71                         show: true,
 72                         rotate: 0,
 73                         interval: 'auto',
 74                         onGap: true
 75                     },
 76                     axisTick: {
 77                         show: false,
 78                         inside:false
 79                     },
 80                     type: 'category',
 81                     splitLine: {
 82                         show: false
 83                     },
 84                     boundaryGap: true,
 85                     data: convertedData[0],
 86                     axisLine: {
 87                         show: true,
 88                         lineStyle: {
 89                             width: 1,
 90                             color: '#F0F0F0'
 91                         }
 92                     },
 93                     nameTextStyle: {
 94                         color: '#000000',
 95                         fontStyle: 'normal',
 96                         fontWeight: 'normal',
 97                         fontFamily: 'sans-serif',
 98                         fontSize: 12
 99                     }
100                 }
101             ],
102             yAxis: [
103                 {
104                     min:0,
105                     type: 'value',
106                     position:'left',
107                     splitArea: {
108                         show: false
109                     },
110                     splitNumber: 5,
111                     boundaryGap: [
112                         0,
113                         0.2
114                     ],
115                     axisLine: {
116                         show: true,
117                         lineStyle: {
118                             width: 1,
119                             color: '#D6D7D7'
120                         }
121                     },
122                     axisLabel: {
123                         formatter: '{value}'
124                     }
125                 },
126                 {
127                     max:100,
128                     type: 'value',
129                     position:'right',
130                     splitArea: {
131                         show: false
132                     },
133                     splitNumber: 5,
134                     boundaryGap: [
135                         0,
136                         0.2
137                     ],
138                     axisLine: {
139                         show: true,
140                         lineStyle: {
141                             width: 1,
142                             color: '#D6D7D7'
143                         }
144                     },
145                     axisLabel: {
146                         formatter: '{value}%'
147                     }
148                 }
149             ],
150             color:['#9AD0E2','#FAC026'],
151             series: [
152                 {
153                     name: '數',
154                     type: 'bar',
155                     smooth: true,
156                     clickable: false,//設置為不可以點擊
157                     showAllSymbol: true,
158                     data: convertedData[1]
159                 },
160                 {
161                     name: '率',
162                     type: 'line',
163                     symbol:'circle',
164                     smooth: true,
165                     clickable: false,//設置為不可以點擊
166                     showAllSymbol: true,
167                     yAxisIndex: 1,
168                     data: convertedData[2]
169                 }
170             ]
171 
172         };
173 
174         if(modalChart && modalChart.clear && modalChart.setOption){
175             //有數據且已經被初始化過
176             modalChart.clear();//clear清空了option
177             modalChart.setOption(modalOption);
178         }else{
179             //有數據未被初始化
180             modalChart = echarts.init(document.getElementById('serviceTrendChart'));
181             modalChart.setOption(modalOption);
182         }
183     }else{
184         //無數據情況下
185         if(modalChart && modalChart.clear) modalChart.clear();//被初始化過,清空
186 
187         $("#serviceTrendChart").attr('class','box nodataModal');
188     }
189 }
190 
191 function genModalTrend(flag) {
192     var theFlag = '0' + flag;
193     var datatrend = null;
194     var url = xxxxx;
195     var endTime = condition.time;//暴露給外部,發請求直接用time,內部計算用 condition.selectedTime
196     var beginTime = getStartTime(condition.selectedTime,condition.timeUnit);
197     var para = [
198         {"name": "provincecode", "value": condition.provincecode},
199         {"name": "citycode", "value": condition.citycode},
200         {"name": "districtcode", "value": condition.districtcode},
201         {"name": "beginTime", "value": beginTime},
202         {"name": "endTime", "value": endTime},
203         {"name":"unit","value":condition.timeUnit},
204         {"name":"flag","value":theFlag}
205     ];
206 
207     $.ajax({
208         type: "GET",
209         contentType: "application/json",
210         url: url,
211         data: rdkData(para),
212       //  async: false, //必須同步,還是可以異步,放到回調函數里面做?
213         success: function (data) {
214             datatrend = eval("(" + data.result + ")");
215             var convertedData = convertModalData(datatrend, endTime, condition.timeUnit);
216             createModalTrend(convertedData);
217             if (modalChart && modalChart.resize) {
218                 modalChart.resize();
219             }
220         },
221         error: function (XMLHttpRequest, textStatus, errorThrown) {
222              createModalTrend(null);
223            // var fakeData = [['2016-07-04',32,98.5],['2016-07-07',88,52.2],['2016-07-08',100,40],['2016-07-14',111,2]];
224            // createModalTrend(convertModalData(fakeData,endTime,condition.timeUnit));
225         }
226     });
227 }
228 
229 function convertModalData(reqData, endDate, timeUnit) {
230     if (reqData == null || reqData.length == 0) {
231         return null;
232     }
233     var num = 0;
234     var k = 0;
235 
236     var arrData = [];
237     arrData[0] = [];//日期
238     arrData[1] = [];//
239     arrData[2] = [];//
240     switch (timeUnit) {
241         case 'day':
242             num = 30;
243             for (k = 0; k <= num; k++) {
244                 arrData[1][k] = 0;//
245                 arrData[2][k] = 0;//
246                 arrData[0][k] = getPreDay(endDate, num-k);//日期初始化,從小到大
247             }
248             break;
249         case 'week':
250             num = 7;
251             for (k = 0; k <= num; k++) {
252                 arrData[1][k] = 0;//
253                 arrData[2][k] = 0;//
254                 arrData[0][k] = getPreWeek(endDate, num-k);//日期初始化
255             }
256             break;
257         case 'month':
258             num = 11;
259             for (k = 0; k <= num; k++) {
260                 arrData[1][k] = 0;//
261                 arrData[2][k] = 0;//
262                 arrData[0][k] = getPreMonth(endDate, num-k);//日期初始化
263             }
264             break;
265         default :
266             return null;
267             break;
268     }
269     /** 趨勢圖數據數量[0,num] **/
270 //數據reqData沒有按日期從小到大排列
271     for(k=0;k<=num;k++){
272    
273         for (var i = 0; i < reqData.length; i++){
274             //如果日期對的上
275             if (reqData[i] && reqData[i][0] && arrData[0][k] ===  reqData[i][0]){
276                 if(reqData[i][1] && parseFloat(reqData[i][1])){
277                     //reqData[i][0]//如果數有效
278                     arrData[1][k] = reqData[i][1];
279                 }
280                 if(reqData[i][2] && parseFloat(reqData[i][2])){
281                     // reqData[i][1]//如果率有效
282                     arrData[2][k] = reqData[i][2];
283                 }
284             }
285         }
286     }
287     return arrData;
288 }

時間處理函數:

 1 function getTimeStr(dateObj){
 2     var strYear = dateObj.getFullYear();
 3     var strMonth = dateObj.getMonth() + 1;
 4     if (strMonth < 10) {
 5         strMonth = '0' + strMonth;
 6     }
 7     var strDay = dateObj.getDate();
 8     if (strDay < 10) {
 9         strDay = '0' + strDay;
10     }
11     return strYear + '-' + strMonth + '-' + strDay;
12 }
13 
14 /**以參數dateString為基准,前days天的日期**/
15 
16 function getPreDay(dateString, days) {
17     if(days === 0) return dateString;
18     if (dateString.split('-').length != 3) return '';
19     var result = dateString.replace(/-/g, '/');
20     var theMiliseconds = Date.parse(result);
21     var pre_milliseconds = theMiliseconds - 1000 * 60 * 60 * 24 * parseInt(days);
22     var preDate = new Date(pre_milliseconds);
23     var strPreDate = getTimeStr(preDate);
24     return strPreDate;
25 }
26 /**若粒度為周,則顯示最近8周內的趨勢,weeks傳入7。周基於天計算,傳入dateString必須為天形式,dateString應該為selectedTime  **/
27 
28 function getPreWeek(dateString, weeks) {
29 
30     if (dateString.split('-').length != 3) return '';//dateString應該傳入selectedTime
31     var strPreDate = getPreDay(dateString, weeks * 7);
32     var checkDate = new Date(strPreDate.replace(/-/g, '/'));
33     checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
34     var time = checkDate.getTime();
35     checkDate.setMonth(0);
36     checkDate.setDate(1);
37     var week = Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; //86400000即一天的毫秒數
38     var timeText = checkDate.getFullYear() + "-" + (week < 10 ? '0' : '') + week;
39     return timeText;
40 }
41 
42 /**若粒度為月,則顯示12月內的趨勢,months傳入11  **/
43 
44 function getPreMonth(dateString, months) {
45     if(months === 0) return dateString;
46     if (dateString.split('-').length != 2) return;
47     var y = Math.round(months / 12); //滿12月減一年
48     var m = months % 12;
49     var result = dateString.split('-');
50     var theYear = parseInt(result[0]);
51     var theMonth = parseInt(result[1]);
52     if (theMonth <= m) {
53         theYear = theYear - 1 - y;
54         theMonth = theMonth + 12 - m;
55     } else
56     {
57         theYear = theYear - y;
58         theMonth = theMonth - m
59     }
60     if (theMonth <= 9) {
61         theMonth = '0' + theMonth;
62     }
63     return theYear + '-' + theMonth;
64 }
65 
66 /**針對天周月,求趨勢圖 開始時間
67  * 30天
68  * 8周
69  * 12月
70  * **/
71 function getStartTime(endTime,timeUnit) {
72     switch (timeUnit){
73         case 'day':
74             return getPreDay(endTime,30);//起始日期為[前30天,endTime]  共31天
75             break;
76         case 'week':
77             return getPreWeek(endTime,7);//共八周
78             break;
79         case 'month':
80             return getPreMonth(endTime,11);//共12月
81             break;
82         default :
83             return endTime;
84     }
85 
86 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM