前端用echarts繪制含有多個(gè)分層的波形圖關(guān)鍵代碼
一、效果圖展示
先展示一下實(shí)際的效果圖
用戶選擇完需要的波形參數(shù)字段之后,頁面開始渲染圖表,有幾個(gè)參數(shù)就要渲染幾個(gè)grid,也就是幾行波形。
二、繪制邏輯
拿到所選的參數(shù)數(shù)據(jù)之后
1.首先是給橫坐標(biāo)軸的里程-數(shù)據(jù)注入
2.修改tooltip(跟著豎線走的卡片彈窗)里面的彈出窗的顯示,需要返回html模板字符串
3.修改datazoom(最底下的藍(lán)色滑動(dòng)窗),里面初始的起點(diǎn)和終點(diǎn)
4.按照參數(shù)的個(gè)數(shù)添加grid(每一行的波形),需要疊加計(jì)算的是,距離bottom的高度,一個(gè)距離100,2個(gè)距離200
5.按照參數(shù)的個(gè)數(shù)添加xAxis里面的對(duì)象 (需要修改 gridIndex 0 1 2 ...)
只有第一個(gè)對(duì)象,要顯示X軸坐標(biāo),且同時(shí)要判斷X軸坐標(biāo)是否包含車站
第二個(gè)對(duì)象開始不顯示xAxis坐標(biāo)軸
6.修改y軸 (可顯示刻度)(需要修改 gridIndex 0 1 2 ...)
7.最后修改series 每個(gè)參數(shù)是一個(gè)對(duì)象的配置(包括數(shù)據(jù),線條的類型,顏色)
(值得注意的是,這套繪制,建議放置在一個(gè)函數(shù)里,然后加載時(shí)調(diào)用,重新繪制時(shí)調(diào)用,需要注意重新繪制時(shí),除了要myChart.dispose(); //銷毀,還要重新配置option)
三、關(guān)鍵代碼
繪制邏輯代碼:
const self = this; //重新給圖標(biāo)賦值數(shù)據(jù) this.tableData.forEach(function (currentValue, index, array) { // 4.按照參數(shù)的個(gè)數(shù)添加grid,需要疊加計(jì)算的是,距離bottom的高度,一個(gè)距離100,2個(gè)距離200 let height = (index+1)*100; if(index===array.length-1){ self.option.grid.push({ show:true, left: 50, right: 50, bottom: height, height: 100, //每一個(gè)折現(xiàn)圖的高度 backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white', // 背景色 }) }else{ self.option.grid.push({ show:true, left: 50, right: 50, bottom: height, height: 100, //每一個(gè)折現(xiàn)圖的高度 backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white', // 背景色 }) } // 5.按照參數(shù)的個(gè)數(shù)添加xAxis里面的對(duì)象 (需要修改 gridIndex 0 1 2 ...) // !!!只有第一個(gè)對(duì)象,要顯示X軸坐標(biāo),且同時(shí)要判斷X軸坐標(biāo)是否包含車站 // 第二個(gè)對(duì)象開始不顯示坐標(biāo)軸 if(index==0){ self.option.xAxis.push({ gridIndex: 0, //x 軸所在的 grid 的索引 type: 'category', //類目軸 boundaryGap: false, //坐標(biāo)軸兩邊留白策略, axisLine: { //是否顯示坐標(biāo)軸軸線。 onZero: false, lineStyle: { color: 'black', width: 2, }, }, //車站標(biāo)注 axisLabel: { // interval: 0,//自適應(yīng)X軸間距 formatter: function (params) { // 自定義div // console.log(typeof(params)) let res; if (params.includes('站')) { res = '{abg11|' + params + '}'; } else { res = '{abg1|' + params + '}'; } return res; }, rich: { abg11: { backgroundColor: '#2B8AFD', width: '100%', align: 'right', height: 22, borderRadius: 3, padding: [2, 4, 2, 4], color: '#ffffff', }, abg1: { color: '#595959', }, }, }, data: xData, show: true, //是否顯示 x 軸。 }) }else{ self.option.xAxis.push({ gridIndex: index, //x 軸所在的 grid 的索引 type: 'category', //類目軸 boundaryGap: false, //坐標(biāo)軸兩邊留白策略, axisLine: { onZero: true, //X 軸的軸線是否在另一個(gè)軸的 0 刻度上,只有在另一個(gè)軸為數(shù)值軸且包含 0 刻度時(shí)有效。 lineStyle: { color: '#979797', }, }, data: xData, show: true, //是否顯示 x 軸。 axisTick: { //坐標(biāo)軸刻度相關(guān)設(shè)置 show: false, }, axisLabel: { //刻度標(biāo)簽 show: false, }, }) } // 6.修改y軸 (可顯示刻度)(需要修改 gridIndex 0 1 2 ...) self.option.yAxis.push({ gridIndex: index, //y 軸所在的 grid 的索引 type: 'value', // name: "PM2.5",//縱坐標(biāo)名字 // nameLocation: "middle",//縱坐標(biāo)名字的位置 // nameGap: 30,//縱坐標(biāo)名字與軸線之間的距離 position: 'left', //y軸的位置 inverse: false, splitLine: { //坐標(biāo)軸在 grid 區(qū)域中的分割線 show: false, }, axisLine: { //坐標(biāo)軸軸線相關(guān)設(shè)置 豎著那一根 show: true, lineStyle: { color: '#979797', }, }, axisTick: { //坐標(biāo)軸刻度相關(guān)設(shè)置 show: false, }, axisLabel: { //刻度標(biāo)簽 show: false, }, },) // 7.最后修改series 每個(gè)參數(shù)是一個(gè)對(duì)象 self.option.series.push({ //參數(shù)的名字-數(shù)據(jù)注入 name: currentValue.name, type: 'line', color: self.colorArray[index], // 設(shè)置不顯示小圓圈 symbol: 'none', showSymbol: false, xAxisIndex: index, //使用的 x 軸的 index,在單個(gè)圖表實(shí)例中存在多個(gè) x 軸的時(shí)候有用。 yAxisIndex: index, //使用的 y 軸的 index,在單個(gè)圖表實(shí)例中存在多個(gè) x 軸的時(shí)候有用。 symbolSize: 8, //標(biāo)記的大小 // hoverAnimation: false, smooth: true, //平滑曲線 //每個(gè)grid的數(shù)據(jù)-數(shù)據(jù)注入 data: currentValue.data, markLine: { symbol: 'none', //去掉箭頭 //最大值和最小值 data: [ { // type: 'median', //中位數(shù)。 type: 'average', //中位數(shù)。 symbol: 'none', //去掉開始的原點(diǎn) label: { //字體設(shè)置 show: 'true', position: 'insideEndTop', distance: 10, formatter: currentValue.name, color: 'inherit', }, lineStyle: { //橫線設(shè)置 width: 1, }, }, ], }, lineStyle: { shadowColor: self.colorArray[index], //透明的顏色 shadowOffsetX: 0, shadowOffsetY: 0, opacity: 0.8, //透明度 shadowBlur: 8, //陰影大小 type: "solid", //實(shí)線 width: 2, }, }) }); this.getHeight(this.tableData.length)//重新獲得動(dòng)態(tài)的圖表高度 //折線圖 this.$nextTick(()=>{ this.getChart();//實(shí)際繪制 })
動(dòng)態(tài)高度函數(shù)代碼:
//獲得動(dòng)態(tài)高度 getHeight(num){ this.dynamicHeight = `${num * 100 + 150}px`; },
繪制代碼:
//繪制折線圖 getChart() { const chartDom = document.getElementById('main-echarts'); if (myChart != null && myChart != '' && myChart != undefined) { console.log("銷毀了"); myChart.dispose(); //銷毀 } // // 顯示加載圖 // myChart.showLoading(); this.$nextTick(()=>{ myChart = echarts.init(chartDom); myChart.setOption(this.option, true);//這里設(shè)置true,會(huì)每次根據(jù)數(shù)據(jù)重新繪制,設(shè)置為false之后,每次新的繪制會(huì)在原有圖表的基礎(chǔ)上再添加(不會(huì)有斷裂感,會(huì)形成流動(dòng)感) }) window.addEventListener('resize', function () { myChart.resize(); }); }
Y軸名字顯示且豎直放置:
// 6.修改y軸 (可顯示刻度)(需要修改 gridIndex 0 1 2 ...) self.option.yAxis.push({ gridIndex: index, //y 軸所在的 grid 的索引 type: 'value', name: currentValue.name.toString().split("").join("\n"),//縱坐標(biāo)名字豎直從上到下排列 nameRotate:0, nameTextStyle: { padding: 10, // 設(shè)置與坐標(biāo)軸的距離,單位為像素 color: 'black', // 這里設(shè)置顏色 }, nameLocation: "middle",//縱坐標(biāo)名字的位置 nameGap: 40,//縱坐標(biāo)名字與軸線之間的距離 position: 'left', //y軸的位置 inverse: false, splitLine: { //坐標(biāo)軸在 grid 區(qū)域中的分割線 show: false, }, axisLine: { //坐標(biāo)軸軸線相關(guān)設(shè)置 豎著那一根 show: true, lineStyle: { color: '#979797', }, }, axisTick: { //坐標(biāo)軸刻度相關(guān)設(shè)置 show: false, }, axisLabel: { //刻度標(biāo)簽 show: true, showMinLabel: false, // 隱藏最小值標(biāo)簽 showMaxLabel: false, // 隱藏最大值標(biāo)簽 }, },)
彈窗顯示為半透明
this.option = { //鼠標(biāo)放上去顯示的彈窗 tooltip: { trigger: 'axis', //坐標(biāo)系出觸發(fā) backgroundColor: 'rgba(255, 255, 255, 0.7)', // 設(shè)置白色的半透明背景
總結(jié)
到此這篇關(guān)于前端用echarts繪制含有多個(gè)分層的波形圖的文章就介紹到這了,更多相關(guān)前端echarts繪制波形圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)輪播圖方法(邏輯清晰一看就懂)
這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)輪播圖方法的相關(guān)資料,JS輪播圖的實(shí)現(xiàn)核心是使用JavaScript來控制圖片的切換和顯示,配合HTML和CSS完成布局和樣式設(shè)置,文中介紹的方法邏輯清晰一看就懂,需要的朋友可以參考下2023-12-12JavaScript正則表達(dá)式函數(shù)總結(jié)(常用)
正則表達(dá)式作為一種匹配處理字符串的利器在很多語言中都得到了廣泛實(shí)現(xiàn)和應(yīng)用.這篇文章主要介紹了JavaScript正則表達(dá)式函數(shù)總結(jié),需要的朋友可以參考下2018-02-02基于element?UI?input組件自行封裝“數(shù)字區(qū)間”輸入框組件的問題及解決
這篇文章主要介紹了基于element?UI?input組件自行封裝“數(shù)字區(qū)間”輸入框組件,實(shí)現(xiàn)代碼可以分為兩塊一塊為組件的封裝代碼,一塊為文中實(shí)現(xiàn)效果的演示代碼,對(duì)element?UI數(shù)字區(qū)間輸入組件相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05javascript實(shí)現(xiàn)確定和取消提示框效果
這篇文章主要介紹了javascript實(shí)現(xiàn)確定和取消提示框效果的方法以及示例代碼分享,有需要的小伙伴可以參考下。2015-07-07JS+Canvas實(shí)現(xiàn)的俄羅斯方塊游戲完整實(shí)例
這篇文章主要介紹了JS+Canvas實(shí)現(xiàn)的俄羅斯方塊游戲,結(jié)合完整實(shí)例形式分析了Canvas技術(shù)實(shí)現(xiàn)俄羅斯方塊游戲的步驟、技術(shù)難點(diǎn)與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12JS實(shí)現(xiàn)網(wǎng)站樓層導(dǎo)航效果代碼實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)站樓層導(dǎo)航效果代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06