echarts图表tooltip中嵌套echarts图

echarts图表tooltip中嵌套echarts图

我们在工作中,如果echarts的需求比较多的话,难免会遇到嵌套图表的需求,看起非常炫酷,实际上却很简单的图表,先给大家看看应用场景,上图
在这里插入图片描述

上面折线图中嵌套了一个雷达图,当我们鼠标移动到当前X轴对应的数据项时,根据数据生成不同的雷达图。我们都知道生成echarts图时通过获取dom节点实例化生成的,两个问题tooltip里面的dom元素怎么生成?数据怎么处理?话不多说我们上代码(代码中的关键部分有注释)

//这里是折线图的组件代码
<template>
  <div>
    <div :ref="id" class="right"></div>
  </div>
</template>

<script>
import mixins from "绝对路径"
import totalMangeHttp from "相对路径";
export default {
    
    
  mixins:[mixins],
  data() {
    
    
    return {
    
    
      myChart: null,
      myChartTwo:null,
      totalvalue:[],
      text:'',
      typelist:[],
      type:''
    };
  },
  created() {
    
    
    this.getdatastr('typelist','AI_ATMOSPHERE_TYPE')
  },
  mounted() {
    
    
    this.$nextTick(() => {
    
    
      this.initQuanProgress(this.id);
    });
  },
  props: {
    
    
    id: {
    
    //传进来的唯一标识
      type: String,
    },
    showData: {
    
    //传进来的折线图的数据
      type: Array,
      default() {
    
    
        return [];
      },
    },
    xdata:{
    
    //折线图X轴的数据
      type:Array,
      default(){
    
    
        return []
      }
    },
    radardata:{
    
    //传进来的 每一项形成雷达图需要的数据
      type:Array,
      default(){
    
    
        return []
      }
    }
  },
  watch: {
    
    
    showData: {
    
    
      deep: true,
      handler(newVal, oldValue) {
    
    
        this.$nextTick(() => {
    
    
          this.initQuanProgress(this.id);
        });
      },
    },
  },
  methods: {
    
    
    getdatastr(attr, code) {
    
    
      totalMangeHttp.searchDataStr({
    
     itemCode: code }).then(res => {
    
    
        this[attr] = res.result;
      });
    },
    initQuanProgress(id) {
    
    //这里不多说,老粉丝应该知道的
      if (!this.$refs[id]) return;
      this.myChart = this.$echarts.init(this.$refs[id]);
      this.myChart.clear();
      this.setQuanProgress();
      window.addEventListener("resize", () => {
    
    
        if (this.myChart) {
    
    
          this.myChart.resize();
        }
      });
    },
    setQuanProgress() {
    
    
      let that = this;
      let option = {
    
    
        title: {
    
    
          subtext: "浓度 (μg/L)",
          left: "3%",
          y: "8%",
          textStyle: {
    
    
            fontSize: 16,
            fontStyle: "normal",
            color: "#000",
          },
        },
        tooltip: {
    
    //关键地方
          trigger: 'axis',
          padding: 3,
          backgroundColor: "#ffffff",
          enterable: true,
          formatter:(params, ticket, callback)=> {
    
    //通过formatter传进来三个参数,并且处理格式,
           //在处理格式的时候添加dom元素,并且加上宽高
           //不明白这三个参数分别是啥的可以像我这样打印一下,
           //然后通过回调把当前数据项传出去
            console.log(params, ticket, callback);
            var htmlStr = `<div id="tooltipChart" ref='tooltipEchart' style='width:160px;height:180px;'></div>`;
            // 记得重新渲染的时候要进行防抖处理,避免性能影响
            callback(that.setTooltipEchart(params));
            return htmlStr;
          },
          position: function(point, params, dom, rect, size) {
    
    
            // 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
            // 提示框位置
            var x = 0; // x坐标位置
            var y = 0; // y坐标位置
            // 当前鼠标位置
            var pointX = point[0];
            var pointY = point[1];
            // 外层div大小
            // var viewWidth = size.viewSize[0];
            // var viewHeight = size.viewSize[1];
            // 提示框大小
            var boxWidth = size.contentSize[0];
            var boxHeight = size.contentSize[1];
            // boxWidth > pointX 说明鼠标左边放不下提示框
            if (boxWidth > pointX) {
    
    
              x = 5;
            } else {
    
    
              // 左边放的下
              x = pointX - boxWidth;
            }
            // boxHeight > pointY 说明鼠标上边放不下提示框
            if (boxHeight > pointY) {
    
    
              y = 5;
            } else {
    
    
              // 上边放得下
              y = pointY - boxHeight;
            }
            return [x, y];
            },
        },
        dataZoom:[
            {
    
    
              type:'slider',//slider表示有滑动块的,inside表示内置的
              show:true,
              xAxisIndex:[0],
              height:'5',
              start:0,
              end:this.xdata.length >= 100 ? 10 : this.xdata.length >= 80 ? 20 : this.xdata.length >= 50 ? 40 : 50,
              bottom:85,
            }
		    ],
        legend: {
    
    
          data: ['no2','o3','pm10','pm25','so2'],
        },
        grid: {
    
    
          left: "3%",
          right: "4%",
          bottom: "8%",
          containLabel: true,
        },
        xAxis: {
    
    
          type: "category",
          boundaryGap: false,
          axisLabel: {
    
    
            show: true,
            interval:2,
            textStyle: {
    
    
              color: "#a9a9a9", //更改坐标轴文字颜色
              fontSize: 10 //更改坐标轴文字大小
            },
            rotate:-50,
           
          },
          data:this.xdata,
        },
        yAxis: {
    
    
          type: "value",
        },
        series: this.showData,
      };
      this.myChart.setOption(option);
    },
    setTooltipEchart(params){
    
    //这里就是处理雷达图的方法
        console.log(params);
        let index = params[0].dataIndex;//拿到tooltip的参数,判断鼠标放在第几个数据项上
        this.text = params[0].axisValue;
        console.log(this.radardata[index]);
        let data = this.radardata[index];//通过index拿到对应的雷达图数据
        this.type = this.formatStr(data['pollution_type'][0],'typelist');
       //下面就是处理雷达图的数据格式了
        this.totalvalue = [
          {
    
    
            name:'特征值',
            value:data['CV']
          },
          {
    
    
            name:'标准值上限',
            value:data['Max']
          },
          {
    
    
            name:'标准值下限',
            value:data['Min']
          },
          {
    
    
            name:'标准值',
            value:data['benchmark']
          }
        ]
        
        this.$nextTick(()=>{
    
    //然后setoption方法生成,记住这里一定要用$nextTick不然你拿不到dom节点
            if (!document.getElementById("tooltipChart")) return;
            this.myChartTwo = this.$echarts.init(document.getElementById("tooltipChart"));
            this.myChartTwo.clear();
            this.setQuanProgresstwo();
        })
    },
    setQuanProgresstwo(){
    
    
      let option = {
    
    
            title: {
    
    
              text:this.text + '时' + '\xa0\xa0\xa0\xa0' + this.type,
              textStyle:{
    
    
                fontSize:12
              }
            },
            legend: {
    
    
              orient: 'horizontal',
              type:'scroll',
              y: "bottom",
              data: ['特征值', '标准值上限', '标准值下限', '标准值'],
            },
            radar: {
    
    
              indicator: [
                {
    
    
                  name: 'so2',
                },
                {
    
    
                  name: 'pm10',
                },
                {
    
    
                  name: 'pm25',
                },
                {
    
    
                  name: 'co',
                },
                {
    
    
                  name: 'no2',
                }
              ],
              nameGap : 3,
              radius: 50,
            },
            series: [
                {
    
    
                name: 'Budget vs spending',
                type: 'radar',
                data: this.totalvalue,
                }
            ]
        };
        this.myChartTwo.setOption(option);
    }
  },
};
</script>
<style lang="less" scoped>
.right {
    
    
  width: 100%;
  height: 280px;
}
</style>

好了,代码到这里就结束,欢迎大家沟通交流,相互温暖,一起提升,加油!!!!

猜你喜欢

转载自blog.csdn.net/m0_52313178/article/details/124371540