實際值、預測值、計劃值、差值紅色顯示
阿新 • • 發佈:2018-12-07
實現效果:
1、實際值和預測值在連線點,只顯示實際值
2、當預測值>計劃值時,出現紅色柱子,同時tooltip顯示預測值、計劃值和超計劃值(超計劃值=預測-計劃)
3、當預測值<=計劃值時,不出現紅色柱子,同時tooltip顯示預測值、計劃值和超計劃值=0
/* 實際值和預測值在連線點,只顯示實際值 當預測值>計劃值時,出現紅色柱子,同時tooltip顯示預測值、計劃值和超計劃值(超計劃值=預測-計劃) 當預測值<=計劃值時,不出現紅色柱子,同時tooltip顯示預測值、計劃值和超計劃值=0 */ var xData = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; // 橫座標 var planData = [0, 7, 4, 7, 4, 7, 9, 7, 4, 7]; // 計劃值 var actualData = [0, 8, 5, 8, 5, '-', '-', '-', '-', '-']; // 實際值,最後一個數字和預計值同下表值相同,這樣實際和預測才能顯示成平滑的曲線,不斷開 var predictData = ['-', '-', '-', '-', 5, 8, 9, 9, 6, 5]; // 預計值 var minDataDownStackBar = []; // 最小值{預測和計劃做比較,誰小顯示誰} var differenceDataUpStackBar = []; // 差值=預測-計劃,有負數 var seriesData = []; //輔助陣列,儲存series資料 // 求最小值和差值 for (var i = 0; i < planData.length; i++) { if (actualData[i] != '-') { //實際值不為-時,最小值和差值均顯示成-,這樣堆積的柱子,在虛線出現之前都不顯示出來 minDataDownStackBar[i] = '-'; differenceDataUpStackBar[i] = '-'; } else { //實際值為-時,預測和計劃誰小顯示誰 differenceDataUpStackBar[i] = predictData[i] - planData[i]; if (predictData[i] <= planData[i]) { //預計值<=計劃值,minDataDownStackBar取預計值,differenceDataUpStackBar作差 minDataDownStackBar[i] = predictData[i]; } else { //預計值>計劃值,minDataDownStackBar取預計值,differenceDataUpStackBar作差 minDataDownStackBar[i] = planData[i]; } } } seriesData = [actualData, planData, predictData, minDataDownStackBar, differenceDataUpStackBar]; // 系列值、系列顏色、漸變色、圖例名稱 var colorsData = ["#33D663", "#3487C8", "#48c871", "#48c871", "#48c871"]; // 線顏色 var offsetcolors = ['rgba(51,214,99,1)', 'rgba(51,214,99,0.2)', 'rgba(52,135,200,1)', 'rgba(52,135,200,.2)']; // 漸變色設定 var legenseriesParamsDataata = ["實際", "計劃", "預測", "差值", "差值"]; // 圖例,堆積也用此陣列 var seriesParamsData = []; //輔助陣列,用來存放series物件 for (var i = 0; i < seriesData.length; i++) { var strType; if (i < 3) { strType = 'line'; } else { strType = 'bar'; } var item = { name: legenseriesParamsDataata[i], type: strType, stack: legenseriesParamsDataata[i], smooth: true, symbolSize: 1, itemStyle: { // 拐點值 normal: { color: colorsData[i], // 取實線的顏色 } }, data: seriesData[i], }; if (i === 0) { item.areaStyle = { // 實際值-------加漸變色 normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: offsetcolors[0] }, { offset: 1, color: offsetcolors[1] }]) }, }; } else if (i === 1) { item.areaStyle = { // 計劃值---------加漸變色 normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: offsetcolors[2] }, { offset: 1, color: offsetcolors[3] }]) }, }; } else if (i === 2) { // 預測值------------加虛線 item.lineStyle = { normal: { width: 2, color: colorsData[i], // 取虛線的顏色 type: 'dashed' } }; } else if (i === 3) { // 最小值----------設定下面堆積柱子的顏色和值 item.zlevel = -1; var downData = []; //輔助陣列,用來儲存下方堆積柱子的顏色和值 for (var j = 0; j < seriesData[4].length; j++) { if (seriesData[4][j] === "-" || seriesData[4][j] <= 0) { //根據最後差值判斷是否顯示堆積柱子的下部分 downData[j] = { value: seriesData[3][j], itemStyle: { normal: { color: "rgba(250,84,84,.0)" //透明 } } }; } else { // 差值>0,超計劃,顯示成紅色 downData[j] = { value: seriesData[3][j], itemStyle: { normal: { color: "rgba(250,84,84,1)" } } }; } } item.data = downData; // item.itemStyle.normal.color = '#fa5454';// 最小值的顏色,堆積 item.barWidth = 20; } else if (i === 4) { // 差值 item.barWidth = 20; var upData = []; //輔助陣列,用來儲存上方堆積柱子的顏色和值 for (var j = 0; j < seriesData[4].length; j++) { if (seriesData[4][j] === "-" || seriesData[4][j] <= 0) { // 差值-||<=0,則超值為0 upData[j] = { value: 0 }; } else { // 差值>0,超計劃,顯示成紅色 upData[j] = { value: seriesData[4][j], itemStyle: { normal: { color: "rgba(250,84,84,1)" //超計劃顯示的顏色 }, } }; } } item.data = upData; } seriesParamsData.push(item); } var option = { backgroundColor: '#8B4513', color: colorsData, legend: { //圖例 show: true, data: [{ name: legenseriesParamsDataata[1], textStyle: { color: '#fff' }, // icon:'image:///images/echarts/backplan.png' }, { name: legenseriesParamsDataata[0], textStyle: { color: '#fff' }, // icon:'image:///images/echarts/backactual.png' }, { name: legenseriesParamsDataata[2], textStyle: { color: '#fff' }, // icon:'image:///images/echarts/backpredict.png' } ], right: 20, top: 10, }, tooltip: { trigger: 'axis', axisPointer: { type: 'line', lineStyle: { color: '#ffa147', width: 2, type: 'dashed' } }, formatter: function(params) { // debugger; var paraActual = null; //實際 var paraPredict = null; //預測 var paraPlan = null; //計劃 var paraExceedPlan = null; //超計劃 for (var i = 0, len = params.length; i < len; i++) { if (params[i].seriesName.indexOf("實際") > -1) { paraActual = params[i]; } else if (params[i].seriesName.indexOf("計劃") > -1) { paraPlan = params[i]; } else if (params[i].seriesName.indexOf("預測") > -1) { paraPredict = params[i]; } else if (params[i].seriesName.indexOf("差值") > -1) { paraExceedPlan = params[i]; } } var str = ""; //有計劃顯示計劃 if (paraPlan) { str += paraPlan.marker + paraPlan.seriesName + ' : ' + paraPlan.value + '<br/>'; } //有實際顯示實際 if (paraActual && (paraActual.value === 0 || !!paraActual.value) && paraActual.value != '-') { str += paraActual.marker + paraActual.seriesName + ' : ' + paraActual.value + '<br/>'; } //沒有實際判斷是否有預測,顯示預測 else if (paraPredict && (paraPredict.value === 0 || !!paraPredict.value) && paraPredict.value != '-') { str += paraPredict.marker + paraPredict.seriesName + ' : ' + paraPredict.value + '<br/>'; //有差值顯示差值 if (paraExceedPlan && (paraExceedPlan.value === 0 || !!paraExceedPlan.value) && paraExceedPlan.value != '-') { str += paraExceedPlan.marker + '超計劃 : ' + paraExceedPlan.value + '<br/>'; } } // //有差值顯示差值 // if (paraExceedPlan && !!paraExceedPlan.value && paraExceedPlan.value != '-') { // str += paraExceedPlan.marker + '超計劃 : ' + paraExceedPlan.value + '<br/>'; // } return "時間:" + params[0].name + ":00<br>" + str; } }, calculable: false, grid: { top: '10%', left: '10%', right: '10%', bottom: '10%', containLabel: true, }, xAxis: [{ name: "h", nameLocation: 'end', type: 'category', data: xData, nameTextStyle: { color: '#fff', fontSize: 12, }, //座標軸名稱的文字樣式。 boundaryGap: false, axisLine: { show: false }, //軸線顏色 axisTick: { show: false }, //標記長度 splitLine: { show: true, lineStyle: { color: "rgba(52,135,200,.4)", width: 1, type: "solid" } }, //分割線 axisLabel: { show: true, margin: 10, textStyle: { color: function(value) { // x軸文字顏色的設定 return value > 14 ? 'gray' : 'white'; //橫座標預警值 }, } }, }], yAxis: [{ name: '人', type: 'value', nameTextStyle: { color: '#fff' }, //座標軸名稱的文字樣式。 axisLine: { show: false }, //軸線顏色 axisTick: { show: false }, //標記長度 axisLabel: { show: true, color: '#fff' }, //文字 splitLine: { show: true, lineStyle: { color: 'rgba(52,135,200,.4)', width: 1, type: "solid" } }, //分割線 }], series: [] }; option.series = seriesParamsData;