您现在的位置是:首页 > 技术教程 正文

前端-如何用echarts绘制含有多个分层的波形图

admin 阅读: 2024-03-29
后台-插件-广告管理-内容页头部广告(手机)

一、效果图展示

先展示一下实际的效果图

用户选择完需要的波形参数字段之后,页面开始渲染图表,有几个参数就要渲染几个grid,也就是几行波形。

二、绘制逻辑

拿到所选的参数数据之后

1.首先是给横坐标轴的里程-数据注入

2.修改tooltip(跟着竖线走的卡片弹窗)里面的弹出窗的显示,需要返回html模板字符串

3.修改datazoom(最底下的蓝色滑动窗),里面初始的起点和终点

4.按照参数的个数添加grid(每一行的波形),需要叠加计算的是,距离bottom的高度,一个距离100,2个距离200

5.按照参数的个数添加xAxis里面的对象   (需要修改 gridIndex 0 1 2 ...)
只有第一个对象,要显示X轴坐标,且同时要判断X轴坐标是否包含车站
第二个对象开始不显示xAxis坐标轴

6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)

7.最后修改series 每个参数是一个对象的配置(包括数据,线条的类型,颜色)


(值得注意的是,这套绘制,建议放置在一个函数里,然后加载时调用,重新绘制时调用,需要注意重新绘制时,除了要myChart.dispose(); //销毁,还要重新配置option)

三、关键代码

绘制逻辑代码:

  1. const self = this;
  2. //重新给图标赋值数据
  3. this.tableData.forEach(function (currentValue, index, array) {
  4. // 4.按照参数的个数添加grid,需要叠加计算的是,距离bottom的高度,一个距离1002个距离200
  5. let height = (index+1)*100;
  6. if(index===array.length-1){
  7. self.option.grid.push({
  8. show:true,
  9. left: 50,
  10. right: 50,
  11. bottom: height,
  12. height: 100, //每一个折现图的高度
  13. backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white', // 背景色
  14. })
  15. }else{
  16. self.option.grid.push({
  17. show:true,
  18. left: 50,
  19. right: 50,
  20. bottom: height,
  21. height: 100, //每一个折现图的高度
  22. backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white', // 背景色
  23. })
  24. }
  25. // 5.按照参数的个数添加xAxis里面的对象 (需要修改 gridIndex 0 1 2 ...)
  26. // !!!只有第一个对象,要显示X轴坐标,且同时要判断X轴坐标是否包含车站
  27. // 第二个对象开始不显示坐标轴
  28. if(index==0){
  29. self.option.xAxis.push({
  30. gridIndex: 0, //x 轴所在的 grid 的索引
  31. type: 'category', //类目轴
  32. boundaryGap: false, //坐标轴两边留白策略,
  33. axisLine: {
  34. //是否显示坐标轴轴线。
  35. onZero: false,
  36. lineStyle: {
  37. color: 'black',
  38. width: 2,
  39. },
  40. },
  41. //车站标注
  42. axisLabel: {
  43. // interval: 0,//自适应X轴间距
  44. formatter: function (params) {
  45. // 自定义div
  46. // console.log(typeof(params))
  47. let res;
  48. if (params.includes('站')) {
  49. res = '{abg11|' + params + '}';
  50. } else {
  51. res = '{abg1|' + params + '}';
  52. }
  53. return res;
  54. },
  55. rich: {
  56. abg11: {
  57. backgroundColor: '#2B8AFD',
  58. width: '100%',
  59. align: 'right',
  60. height: 22,
  61. borderRadius: 3,
  62. padding: [2, 4, 2, 4],
  63. color: '#ffffff',
  64. },
  65. abg1: {
  66. color: '#595959',
  67. },
  68. },
  69. },
  70. data: xData,
  71. show: true, //是否显示 x 轴。
  72. })
  73. }else{
  74. self.option.xAxis.push({
  75. gridIndex: index, //x 轴所在的 grid 的索引
  76. type: 'category', //类目轴
  77. boundaryGap: false, //坐标轴两边留白策略,
  78. axisLine: {
  79. onZero: true, //X 轴的轴线是否在另一个轴的 0 刻度上,只有在另一个轴为数值轴且包含 0 刻度时有效。
  80. lineStyle: {
  81. color: '#979797',
  82. },
  83. },
  84. data: xData,
  85. show: true, //是否显示 x 轴。
  86. axisTick: {
  87. //坐标轴刻度相关设置
  88. show: false,
  89. },
  90. axisLabel: {
  91. //刻度标签
  92. show: false,
  93. },
  94. })
  95. }
  96. // 6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)
  97. self.option.yAxis.push({
  98. gridIndex: index, //y 轴所在的 grid 的索引
  99. type: 'value',
  100. // name: "PM2.5",//纵坐标名字
  101. // nameLocation: "middle",//纵坐标名字的位置
  102. // nameGap: 30,//纵坐标名字与轴线之间的距离
  103. position: 'left', //y轴的位置
  104. inverse: false,
  105. splitLine: {
  106. //坐标轴在 grid 区域中的分割线
  107. show: false,
  108. },
  109. axisLine: {
  110. //坐标轴轴线相关设置 竖着那一根
  111. show: true,
  112. lineStyle: {
  113. color: '#979797',
  114. },
  115. },
  116. axisTick: {
  117. //坐标轴刻度相关设置
  118. show: false,
  119. },
  120. axisLabel: {
  121. //刻度标签
  122. show: false,
  123. },
  124. },)
  125. // 7.最后修改series 每个参数是一个对象
  126. self.option.series.push({
  127. //参数的名字-数据注入
  128. name: currentValue.name,
  129. type: 'line',
  130. color: self.colorArray[index],
  131. // 设置不显示小圆圈
  132. symbol: 'none',
  133. showSymbol: false,
  134. xAxisIndex: index, //使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。
  135. yAxisIndex: index, //使用的 y 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。
  136. symbolSize: 8, //标记的大小
  137. // hoverAnimation: false,
  138. smooth: true, //平滑曲线
  139. //每个grid的数据-数据注入
  140. data: currentValue.data,
  141. markLine: {
  142. symbol: 'none', //去掉箭头
  143. //最大值和最小值
  144. data: [
  145. {
  146. // type: 'median', //中位数。
  147. type: 'average', //中位数。
  148. symbol: 'none', //去掉开始的原点
  149. label: {
  150. //字体设置
  151. show: 'true',
  152. position: 'insideEndTop',
  153. distance: 10,
  154. formatter: currentValue.name,
  155. color: 'inherit',
  156. },
  157. lineStyle: {
  158. //横线设置
  159. width: 1,
  160. },
  161. },
  162. ],
  163. },
  164. lineStyle: {
  165. shadowColor: self.colorArray[index], //透明的颜色
  166. shadowOffsetX: 0,
  167. shadowOffsetY: 0,
  168. opacity: 0.8, //透明度
  169. shadowBlur: 8, //阴影大小
  170. type: "solid", //实线
  171. width: 2,
  172. },
  173. })
  174. });
  175. this.getHeight(this.tableData.length)//重新获得动态的图表高度
  176. //折线图
  177. this.$nextTick(()=>{
  178. this.getChart();//实际绘制
  179. })

动态高度函数代码:

  1. //获得动态高度
  2. getHeight(num){
  3. this.dynamicHeight = `${num * 100 + 150}px`;
  4. },

绘制代码:

  1. //绘制折线图
  2. getChart() {
  3. const chartDom = document.getElementById('main-echarts');
  4. if (myChart != null && myChart != '' && myChart != undefined) {
  5. console.log("销毁了");
  6. myChart.dispose(); //销毁
  7. }
  8. // // 显示加载图
  9. // myChart.showLoading();
  10. this.$nextTick(()=>{
  11. myChart = echarts.init(chartDom);
  12. myChart.setOption(this.option, true);//这里设置true,会每次根据数据重新绘制,设置为false之后,每次新的绘制会在原有图表的基础上再添加(不会有断裂感,会形成流动感)
  13. })
  14. window.addEventListener('resize', function () {
  15. myChart.resize();
  16. });
  17. }

 Y轴名字显示且竖直放置:

  1. // 6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)
  2. self.option.yAxis.push({
  3. gridIndex: index, //y 轴所在的 grid 的索引
  4. type: 'value',
  5. name: currentValue.name.toString().split("").join("\n"),//纵坐标名字竖直从上到下排列
  6. nameRotate:0,
  7. nameTextStyle: {
  8. padding: 10, // 设置与坐标轴的距离,单位为像素
  9. color: 'black', // 这里设置颜色
  10. },
  11. nameLocation: "middle",//纵坐标名字的位置
  12. nameGap: 40,//纵坐标名字与轴线之间的距离
  13. position: 'left', //y轴的位置
  14. inverse: false,
  15. splitLine: {
  16. //坐标轴在 grid 区域中的分割线
  17. show: false,
  18. },
  19. axisLine: {
  20. //坐标轴轴线相关设置 竖着那一根
  21. show: true,
  22. lineStyle: {
  23. color: '#979797',
  24. },
  25. },
  26. axisTick: {
  27. //坐标轴刻度相关设置
  28. show: false,
  29. },
  30. axisLabel: {
  31. //刻度标签
  32. show: true,
  33. showMinLabel: false, // 隐藏最小值标签
  34. showMaxLabel: false, // 隐藏最大值标签
  35. },
  36. },)

弹窗显示为半透明

  1. this.option = {
  2. //鼠标放上去显示的弹窗
  3. tooltip: {
  4. trigger: 'axis', //坐标系出触发
  5. backgroundColor: 'rgba(255, 255, 255, 0.7)', // 设置白色的半透明背景

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索