echarts图表tooltip中嵌套echarts图

5 篇文章 1 订阅

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>

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

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
ECharts是一个强大的JavaScript数据可视化库,它提供了丰富的图表类型和交互功能,其 tooltip(提示框)是图表一个关键元素,用于在鼠标悬停在图表上特定数据点时显示详细信息。EChartstooltip支持自定义样式、内容格式以及显示行为。 以下是ECharts tooltip的基本介绍: 1. **基础使用**:默认情况下,当你将鼠标悬停在图表上的数据点时,tooltip会显示相应的值。你可以通过配置`tooltip`选项来启用或关闭这个功能。 ```js option = { tooltip: { trigger: 'item' // 或者 'axis' 或者 'none' }, series: [...] }; ``` 2. **样式定制**:可以通过`formatter`属性自定义提示框的内容格式,使用模板字符串或函数返回值。还可以设置`positioner`来改变提示框的位置策略。 ```js tooltip: { formatter: function (params) { return params.name + '<br>' + params.value; }, positioner: function (point, size, rect) { return [point, rect.height - point - size.height]; // 上移提示框 } } ``` 3. **事件控制**:可以监听`onShow`、`onHide`等事件,以实现更复杂的交互逻辑。 4. **系列间联动**:如果图表有多个系列,可以通过`cross轴联动`或者`同名系列联动`,使得鼠标悬停在某一数据点时,所有相关的图表都会显示相应提示。 相关问题: 1. EChartstooltip有哪些触发方式? 2. 如何在ECharts添加自定义提示框样式? 3. 如何在ECharts实现图表间的联动提示?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段子君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值