Echarts堆積柱狀圖排序是按照堆積柱狀圖的柱子高度進行從大到小(或者從小到大)進行排序,方便查閱各坐標情況。以下是我自己研發的方法,有不對的地方敬請諒解,隨時歡迎指教。 排序後效果如下圖: (1)排序函數,這是一個簡單的冒泡排序,首先計算橫坐標各柱子的和,然後進行簡單的冒泡排序(因為時間緊),可 ...
Echarts堆積柱狀圖排序是按照堆積柱狀圖的柱子高度進行從大到小(或者從小到大)進行排序,方便查閱各坐標情況。以下是我自己研發的方法,有不對的地方敬請諒解,隨時歡迎指教。
排序後效果如下圖:
(1)排序函數,這是一個簡單的冒泡排序,首先計算橫坐標各柱子的和,然後進行簡單的冒泡排序(因為時間緊),可以選擇其它效率更高的排序方法,原理都是一樣的。
/** * Echarts堆積柱狀圖排序 * @Author * @Date 2019/2/25 * @Version 1.0 * @param obj * @returns {*} * */ function multi_bubbleSort(obj) { let data0 = obj.data0;//橫坐標數組 let data = new Array(data0.length).fill(0);//定義一組與橫坐標數組相同大小的且全部為0的數組,用來存儲堆積柱狀圖的和 let len = obj.data0.length;//橫坐標數組長度 for (let k = 0; k < len; k++) { for (let m = 0; m < obj.data1.length; m++) { data[k] = Number(data[k]) + Number(obj.data1[m][k]);//求和,用來排序 } } //簡單排序 for (let i = 0; i < len; i++) { for (let j = 0; j < len - 1 - i; j++) { if (Number(data[j]) < Number(data[j + 1])) { //相鄰元素兩兩對比 let temp = data[j + 1]; //元素交換 data[j + 1] = data[j]; data[j] = temp; //交換橫坐標元素 let te = obj.data0[j + 1]; //元素交換 obj.data0[j + 1] = obj.data0[j]; obj.data0[j] = te; //交換各堆積柱狀圖元素 for (let m = 0; m < obj.data2.length; m++) { let tem = obj.data2[m][j + 1]; obj.data2[m][j + 1] = obj.data2[m][j]; obj.data2[m][j] = tem; } } } } return obj; }
(2)核心點擊事件,首先獲取各legend圖標是否點擊,true:未點擊;false:點擊;其次清空需要重新渲染的數據,然後調用上面的排序函數,最後給清空的值添加數據,重新渲染圖表。
//Echarts legend的點擊事件以及數據渲染 tzjcChart.on('legendselectchanged', function (object) { //獲取legend各圖例點擊與否,true為未點擊,false為點擊; let one = object.selected.一類; let two = object.selected.二類; let three = object.selected.三類; let four = object.selected.四類; let five = object.selected.五類; //獲取option對象 let option = this.getOption(); //清空需要重新渲染的數據 option.xAxis[0].data = []; option.series[0].data = []; option.series[1].data = []; option.series[2].data = []; option.series[3].data = []; option.series[4].data = []; //定義一個對象,data0:X軸坐標數組;data1:二維數組,存legend為true的series數組;data2:二維數組,存儲所有的series數組 let obj = { "data0": tzjcdata0, "data1": [], "data2": [tzjcdata1, tzjcdata2, tzjcdata3, tzjcdata4, tzjcdata5] }; //判斷legend圖例是否為true,是就給對象obj的data1追加相應的series數組 if (one) { obj.data1.push(tzjcdata1); } if (two) { obj.data1.push(tzjcdata2); } if (three) { obj.data1.push(tzjcdata3); } if (four) { obj.data1.push(tzjcdata4); } if (five) { obj.data1.push(tzjcdata5); } //調用排序方法,返回排序好的對象 let multi_obj = multi_bubbleSort(obj); //給上面清空的數據添加值 option.xAxis[0].data = multi_obj.data0; option.series[0].data = multi_obj.data2[0]; option.series[1].data = multi_obj.data2[1]; option.series[2].data = multi_obj.data2[2]; option.series[3].data = multi_obj.data2[3]; option.series[4].data = multi_obj.data2[4]; //調用setOption方法,重新渲染堆積柱狀圖 this.setOption(option); });