echarts bar内tooltip的formatter回调参数params.seriesId中的’\0’问题以及stack的获取

Github多人协作 最近有门课程需要几个人一起开发一个项目,此前我们基本都是单干的,多人合作意味着需要及时将我们每个人的代码进行合并,U盘传文件这种方式太慢了,效率不行,而且没法解决两个人同时修改一个文件的问题,这次我们就尝试使用Github来协助开发。下面就来记录一下这次开发遇到的一些问题和解决的方法。 Git的安装 从官网下载最新版按照默认安装即可。 此处不多加说明。 Git常用命令 在此放上一... 阅读详情

对菜鸟来说,这真的是一个深坑……

 

先说结局:

    1、params对象的成员在echarts的“配置项”说明(http://echarts.baidu.com/option.html#series-bar.tooltip.formatter)里进行了介绍,但并没有出现seriesId成员;

    2、以3.5.0版本为例,seriesId最终是由3865行的keyInfo.id ='\0' + keyInfo.name + '\0' + idNum++; 生成的,因此,你总会发现seriesId明明是个字符串,长度seriesId.length却总是不对;

    3、本文意在bar series tooltip的formatter中获取bar的stack值(http://echarts.baidu.com/option.html#series-bar.stack),echarts3.5.0、3.6.1中均未在params对象中提供。本文最终对echarts-3.5.0.js文件的getDataParams方法进行了修改,以便获取到stack参数,以3.5.0版本为例,第3618行开始,整个方法最终如下(其实就增加了一行):

getDataParams: function (dataIndex, dataType) {
    var data = this.getData(dataType);
    var rawValue = this.getRawValue(dataIndex, dataType);
    var rawDataIndex = data.getRawIndex(dataIndex);
    var name = data.getName(dataIndex, true);
    var itemOpt = data.getRawDataItem(dataIndex);

    return {
        componentType: this.mainType,
        componentSubType: this.subType,
        seriesType: this.mainType === 'series' ? this.subType : null,
        seriesIndex: this.seriesIndex,
        seriesId: this.id,
        seriesName: this.name,
        name: name,
        dataIndex: rawDataIndex,
        data: itemOpt,
        dataType: dataType,
        value: rawValue,
        color: data.getItemVisual(dataIndex, 'color'),
        stack: this.get(‘stack’),    //增加此行,修改之处
        // Param name list for mapping `a`, `b`, `c`, `d`, `e`
        $vars: ['seriesName', 'name', 'value']
    };
},


 

罗索的正文:

 

本文针对的echarts版本为:3.5.0;3.6.1;


使用echarts,作者期望初步得到下面的结果图:


 

        并且,在上图中,能实现这样的效果:举例来说,当鼠标hover到“产品1”的“口径1”最上面的棕色区域时,在弹出的tooltip中应该显示中关键字“口径1”、“产品1”、“8类买家”等。

        但是,从上图的tooltip中,能够看到,并没有“口径1”的字眼……

        如何获取?

        从echarts的文档http://echarts.baidu.com/option.html#series-bar.stack处,我们能够看到stack的介绍,它主要起数据堆叠的作用。但尴尬的是,我通过你堆叠之后,却不能知道我的堆叠的组是谁。

        所以,作者仔细观察tooltip的显示,发现seriesId的值“8类买家0”(如上图tooltip内),与seriesName的值“8类买家”就差一个0,而且,当移动到“口径2”时,这个“8类买家0”会变为“8类买家1”。想当然的,作者以为这个0、1至少能够代表stack的索引吧。

        然后就开始了如下的代码:

tooltip : {
        formatter: function(params) {
            var iStackIndex = parseInt(params.seriesId.replace(params.seriesName, ''));
            return aryStack[iStackIndex];
        }
    },

        然后发现,iStackIndex总是为NaN,百思不得其解,各种查看文档各种找资料,玩儿命怀疑智商……

        然而,茫然坚守的调试仍旧没有解决问题。

        然后使用console.log(params.seriesId.length)发现其长度总是不对,而同样的console.log(params.seriesName.length)却是对的。

        经过#%.^&^@的折腾,最后,终于跟同事一起构造出了seriesId里面莫名出现的’\0’。作为前端小白,真心觉得WTF……

        后面的事儿就简单了,搜索echarts的源码,发现真有’\0’出现,然后再一点点回溯,终于发现了本文开头结局中的第2点。

        并且发现了上面的0、1与stack的索引仅是巧合,根本不能用其代表自己构造的stack数组下标。

 

        最后,附上上文echarts图的源码,以便让你知道我在说什么:

        (注意,你需要在http://echarts.baidu.com/demo.html#bar-stack运行下面的代码)

app.title = '堆叠柱状图';

// 生成n个和为sum的随机整数
function randGenerator(n, sum) {
	  var aryRet = [];
  var fSumTmp = sum;
  var iAcc = 0;
  for (var i = 0; i < (n -1); i++) {
  	var iTmp = Math.ceil(Math.random() * (fSumTmp / 2));
    aryRet.push(iTmp);
    fSumTmp -= iTmp;
    iAcc += iTmp;
  }
  aryRet.push(sum-iAcc);
  return aryRet;
}


var aryDataXAxis = ['产品A','产品B','产品C','产品D','产品E'];
var aryDataLegend = ['1类买家','2类买家','3类买家','4类买家','5类买家','6类买家','8类买家'];

// map的格式
// mapData = ['口径1', '口径2']['产品A','产品B','产品C','产品D','产品E']['1类买家','2类买家','3类买家','4类买家','5类买家','6类买家','8类买家']
var mapData = [];
mapData['口径1'] = [];
mapData['口径2'] = [];
var aryStack = [];

// 最外层标明“口径1”、“口径2”
for (var itemMap in mapData) {
    aryStack.push(itemMap);
    // x轴
    for (var itemXAxis in aryDataXAxis) {
        mapData[itemMap][itemXAxis] = [];
        // y轴
        // for (var itemLegend in aryDataLegend) {
        //     mapData[itemMap][itemXAxis].push((Math.random() * 100).toFixed(1));
        // }
        mapData[itemMap][itemXAxis] = randGenerator(aryDataLegend.length, 100);
    }   
}

var arySeries = [];

// 最外层标明“口径1”、“口径2”
for (var itemMap in mapData) {
    
    // y轴
    for (var itemLegend in aryDataLegend) {
        //console.log(aryDataLegend[itemLegend]);
        var objTmp = new Object();
        objTmp.name = aryDataLegend[itemLegend];
        objTmp.type = 'bar';
        objTmp.stack = itemMap;
        objTmp.data = [];
        // x轴
        for (var itemXAxis in aryDataXAxis) {
            objTmp.data.push(mapData[itemMap][itemXAxis][itemLegend]);
        }
        objTmp.tooltip = {
            formatter: function (params) {

                return funcTooltip(params);
            }
        };
        if (itemLegend == aryDataLegend.length - 1) {
            objTmp.label = {
                normal: {
                    show: true,
                    position: 'top',
                    textStyle: {
                        color: '#666'  
                    },
                    formatter: itemMap
                } 
            };
        }
        arySeries.push(objTmp);
    }
}


function funcTooltip(params) {
    var aryHtml = [];
    aryHtml.push('<div style="text-align:left;">');
    for (var item in params) {
        aryHtml.push('<br />');
        aryHtml.push(item + ':' + params[item]);
    }
    aryHtml.push('</div>');
    return aryHtml.join('');
}

option = {
    tooltip : {
        formatter: function(params) {
            var iStackIndex = parseInt(params.seriesId.replace(params.seriesName, ''));
            return aryStack[iStackIndex];
        }
    },
    legend: {
        data: aryDataLegend
    },
    grid: {
        left: '3%',
        right: '4%',
        height: '280',
        containLabel: true
    },
    xAxis : [
        {
            type : 'category',
            data : aryDataXAxis
        }
    ],
    yAxis : [
        {
            type : 'value'
        }
    ],
    series : arySeries
};




CUDA内核反汇编实战:用cuobjdump解锁SASS指令的奥秘 本文详细介绍了CUDA内核与SASS指令的关系,以及使用cuobjdump工具进行反汇编分析的方法。主要内容包括:1. CUDA内核的基本概念及其在GPU并行计算中的重要性;2. SASS指令作为底层汇编指令的关键作用;3. cuobjdump工具的安装配置和使用方法;4. 通过数组加法实例演示反汇编过程;5. 深入分析SASS指令格式、分类和执行流程;6. 两个实际案例展示性能优化和问题排查的应用。文章为开发者提供了深入理解CUDA程序底层执行机制的有效途径。 阅读详情

相关推荐

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 172

【echarts】图表配置tooltip 的formatter,如何获取并显示返回值的其他字段,附示例

分别表示系列名,数据名,数据值等。在 trigger 为 ‘axis’ 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。说到底,无论是哪种方式,最终formatter的return值都是字符串,所以我们需要做的就是字符串的拼接,回调函数的方式的优势在于处理字符串更加灵活,调用属性的方式获取想要的值,可读性更高。{b},{c},{d},{e},分别表示系列名,数据名,数据值等去做拼接来展示,只能展示显示的图表看到的数据,

芳草萋萋鹦鹉洲哦 2万+

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 404

关于Echarts图标的tooltip配置中的formatter

模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。在 trigger 为 ‘axis’ 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。不同图表类型下的 {a},{b},{c},{d} 含义不一样。使用tooltip的formatter进行格式化,格式化前效果如上图,一个是数字,一个是xxx万,不符合设计,需要统一,期望效果是这样。自定义函数的第一个参数params是formatter需要的数据集。

weixin_55501516的博客 9620

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1802

集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制

博主的博客网站 欢迎大家访问! ccbirds.cn ccbirds.github.io 本文主要记录在IC617中原理图的绘制和schematic的使用方法。 新建library 要画设计自己的集成电路,需要建一个自己的库,方便对自己设计文件的管理。 打开library manager,file 下NEW下Library 选择库的保存路径,一般默认即可,并在name中填入自己库的名字。...

ccbirds 7373

tooltip 的formatter

tooltip 就是echarts 中的提示框组件 下图中框起来的部分就是通过tooltip 显示的东东。 使用起来,参考官方API,可以设置在全集,可以设置在坐标系中也可以设置在系列中,还可以设置在系列的每个数据项中。 tooltip有很多属性,其中一个属性就是formatter ,它是提示框浮层内容格式器,也就是具体显示的数值信息哪个框里的内容。 它支持字符串模板和回调函数两种形式...

purple_lumpy的博客 1万+

逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

f6g7h8i9j的博客 730

Echart设置tooltip: formatter格式

修改前 代码: tooltip: { trigger: 'axis', formatter: function (params) { //console.log(params.length); let returnData = ""; for (let i=0;i<params.length;i++){ if (params[i].seriesName!=""){ let indexColor = params[i].color;

man_nam_man的博客 7451

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

Coding... 2831

Echarts formatter

Echarts Formatter

hat_show的博客 2806

星载SAR的各项指标解读(史上最全)

一、系统指标 系统指标主要指雷达系统的通用的指标,以及和卫星整星相关的指标,主要有一下几项: 工作频段: 雷达体制: 极化方式: 设计s

9271

Echarts中tooltip的 formatter用法

tooltip: { trigger: 'item', //formatter: '{b}市 <br/>跨境网络零售:{c}亿元', show: true, formatter: function (params) { ...

挖掘大数据价值,让决策者快速洞悉趋势,让大众读懂数据背后的故事。 9563

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Echarts——绘制饼图并导入数据,tooltip中的formatter使用方法

DIY饼图中的环形图样式

NanChen的博客 9378

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

echarts tooltip的formatter回调参数设置,两组参数情况

如果series中右两组data; series : [ { name : '销量', type : 'bar', data : [209,236,325,439,507,576,722,879,938,1364], }, { name : '增速', type : 'line', data : [1,13,37,35,15,12,25,2...

怪只怪满眼尽是人间烟火 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Echarts图表如何利用formatter自定义tooltip的内容和样式

我的项目需要实现鼠标悬停在某一点的时候,只展示该条线的数据,以及一些图表中未表现的数据。参照原型图,除了横轴和纵轴表示的时间和成功率之外,希望额外展示另两种数据,并且小圆点要和线的颜色相同。在展示多数据图表的时候 有的时候需要图例也展示出一些内容来,例如官方这样子:鼠标悬停的时候展示该点数据。此处主要利用回调函数的形式去实现。具体写法请参照ECharts官网。:用来格式化图例文本,支持字符串模板和回调函数两种形式。但是,官方提供的样式有时不适用所有的开发场景。

m0_70547044的博客 6151

echarts tooltip的formatter自定义样式设置

用echarts折线图的时候,hover数据点的样式是默认,但是有的时候显示的样式和自己理想的样式有区别的时候,我们就需要自己更改样式,来满足自己的需求,呢要怎么进行更改呢,官方文档说明可以在tooltip的formatter方法里面进行定义,下面我们来看一下: hover数据点的默认样式是这样的: 因为时间段比较长的时候,他只会显示年份,月份和日份,但是我如果需要加上每段数据的具体时间,也就是精确到几点几分,这个时候会怎么办呢?我们就可以在tooltip的formatter里面进行自定义,手动添加一些我

weixin_46188204的博客 3万+

tooltip.formatter

回调函数为了能够使得触发的格式能按照自定义的格式,那就需要formatter。tooltip: { trigger: 'axis', formatter: } 方法1 格式:formatter: '{b0}: {c0}<br />{b1}: {c1}'注意使用自定义的变量还有字符串://实例 var a="今日"; ... tooltip: {

Blog 1万+

echarts 图表配置tooltip 的formatter

echarts 的图表配置非常的灵活自由,但是不熟悉的时候容易不知道怎么配置。 最近遇到一处需要自定义tooltip的内容,小小的踩了个坑,特此记录一下解决过程。 tooltip是什么 有的同学可能不清楚tooltip是什么,它实际上就是鼠标移到图表上后展示的类似数据点详情的一个说明,就是我图片上框出来的那个 在options配置项处于第一级目录,与series,xAxis,yAxis同级 fo...

acknowledged的博客 2万+

[Echarts] 异步请求和展示 tooltip 中的 formatter

echarts formatter 回调函数请求后端数据

weixin_42902669的博客 5531

echarts中自定义提示框 (tooltip.formatter)

作者:niexia. 原文:https://blog.csdn.net/niexia_/article/details/77891474 回调函数 为了能够使得触发的格式能按照自定义的格式,那就需要formatter。 tooltip: { trigger: 'axis', formatter: } 方法1 格式:formatter...

yijiupingfan0914的博客 5万+

Echarts图表,利用formatter自定义tooltip的内容和样式

Echarts图表,利用formatter自定义tooltip的内容和样式

橙汁梨子的博客 8417

【Echarts】配置项 之 series

箱型图、箱线图,是一种用作显示一组数据分散情况资料的统计图。数图、主要用来可视化树形数据结构,是一种特殊的层次类型,具有唯一的根节点,左子树和右子树。主题河流,是一种特殊的流图, 它主要用来表示事件或主题等在一段时间内的变化。路径图,用于带有起点和终点信息的线数据的绘制,主要用于航线、路线可视化。旭日图,由多层的环形图组成,在数据结构上,内圈是外圈的父节点。直角坐标系上的散点图可以用来展示数据的 x、y 之间的关系。雷达图,主要用于表现多变量的数据,例如属性分析。关系图,用于展现节点与节点之间的关系数据。

iFulling的博客 8897

echarts 自定义tooltip

在这个配置中,formatter 函数首先显示了 X 轴的文字内容,然后遍历所有传递给它的参数。对于每个数据项,它使用 item.marker 来获取默认的颜色标记,从而保留了原有的图标样式。接着,它对数值进行了四舍五入处理,并使用内联样式设置了 line-height 以增加行间的空白。这种方法确保了你既能够自定义 tooltip 的内容,又不会丢失 ECharts 提供的默认样式和图标。来获取每个数据项的默认颜色标记,并将其包含在我们的自定义内容中。函数遍历了所有传递给它的参数,并对每个值进行了检查。

yzy85的专栏 1509

可视化Echarts中title、tooltip、legend、grid属性的常用设置

可视化Echarts中title、tooltip、legend、grid属性的常用设置

dafsq的博客 1万+
上一篇: IIS服务器配置文件路径及相关说明
下一篇: js生成n个和为固定sum的随机整数
smartcore
博客等级 码龄19年 30粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值