echarts icon indicating copy to clipboard operation
echarts copied to clipboard

[Bug] 热力图坐标轴添加tooltip,触发tooltip时会产生闪动

Open high-dd opened this issue 1 year ago • 1 comments

Version

5.5.1

Link to Minimal Reproduction

https://codepen.io/high-dd/pen/Poraeqa

Steps to Reproduce

官方热力图example基础上,使用chart.setOption({}),分别给x轴和y轴文字添加tooltip。

具体代码如下:

`var dom = document.getElementById('chart-container'); var myChart = echarts.init(dom, null, { renderer: 'canvas', useDirtyRect: false }); var app = {};

var option;

// prettier-ignore const hours = [ '12a', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p' ]; // prettier-ignore const days = [ 'Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday' ]; // prettier-ignore const data = [[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1], [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0], [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]] .map(function (item) { return [item[1], item[0], item[2] || '-']; }); option = { tooltip: { position: 'top', formatter: () => 'value' }, grid: { height: '50%', top: '10%' }, xAxis: { type: 'category', data: hours, splitArea: { show: true }, triggerEvent: true }, yAxis: { type: 'category', triggerEvent: true, data: days, splitArea: { show: true } }, visualMap: { min: 0, max: 10, calculable: true, orient: 'horizontal', left: 'center', bottom: '15%' }, series: [ { name: 'Punch Card', type: 'heatmap', data: data, label: { show: true }, emphasis: { itemStyle: { shadowBlur: 10, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] };

myChart.on('mouseover', (e) => { if (e.componentType === 'xAxis' || e.componentType === 'yAxis') { myChart?.setOption({ tooltip: { alwaysShowContent: true, formatter: () => 'tooltip' } }) myChart?.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: e.dataIndex, position: [e.event?.offsetX, (e.event?.offsetY ?? 0) - 50] }) } })

myChart.on('mouseout', (e) => { if (e.componentType === 'xAxis' || e.componentType === 'yAxis') { myChart?.setOption({ tooltip: { alwaysShowContent: false, formatter: undefined } }) } })

if (option && typeof option === 'object') { myChart.setOption(option); }

window.addEventListener('resize', myChart.resize);`

Current Behavior

1、触发热力图坐标轴tooltip时,热力图重新渲染产生闪动。 2、触发热力图坐标轴tooltip有时会不展示,似乎是因为mouseover和mouseout同时执行了。

Expected Behavior

1、触发热力图坐标轴tooltip的时候热力图保持静默更新,消除闪动。 2、Echarts中如何避免mouseover和mouseout逻辑同时执行?

Environment

- OS:macOS 14.2.1 
- Browser:Chrome 127.0.6533.120
- Framework:native javascript

Any additional comments?

No response

high-dd avatar Aug 27 '24 03:08 high-dd

@high-dd It seems you are not using English, I've helped translate the content automatically. To make your issue understood by more people and get helped, we'd like to suggest using English next time. 🤗

TRANSLATED

TITLE

[Bug] Add tooltip to the heat map coordinate axis, which will flash when the tooltip is triggered.

BODY

Version

5.5.1

Link to Minimal Reproduction

https://codepen.io/high-dd/pen/Poraeqa

Steps to Reproduce

**Official heat map example Based on this, use chart.setOption({}) to give the x-axis and Add tooltip to y-axis text. **

The specific code is as follows:

`var dom = document.getElementById('chart-container'); var myChart = echarts.init(dom, null, { renderer: 'canvas', useDirtyRect: false }); var app = {};

var option;

// prettier-ignore const hours = [ '12a', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p' ]; // prettier-ignore const days = [ 'Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday', 'Sunday' ]; //prettier-ignore const data = [[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0 ], [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], [0 , 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], [1, 0 , 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0 ], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], [1, 18, 8], [1 , 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], [2, 0, 1], [2, 1 , 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0 ], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], [2, 18, 5], [2, 19, 5], [2 , 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], [3, 0, 7], [3, 1, 3], [3, 2 , 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0], [3, 8, 1 ], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], [3 , 21, 4], [3, 22, 4], [3, 23, 1], [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3 , 0], [4, 4, 0], [4, 5, 1], [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2 ], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4 , 22, 3], [4, 23, 0], [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4 , 0], [5, 5, 0], [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4 ], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5 , 23, 0], [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5 , 0], [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0 ], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]] .map(function (item) { return [item[1], item[0], item[2] || '-']; }); option = { tooltip: { position: 'top', formatter: () => 'value' }, grid: { height: '50%', top: '10%' }, xAxis: { type: 'category', data: hours, splitArea: { show: true }, triggerEvent: true }, yAxis: { type: 'category', triggerEvent: true, data: days, splitArea: { show: true } }, visualMap: { min: 0, max: 10, calculable: true, orient: 'horizontal', left: 'center', bottom: '15%' }, series: [ { name: 'Punch Card', type: 'heatmap', data: data, label: { show: true }, emphasis: { itemStyle: { shadowBlur: 10, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] };

myChart.on('mouseover', (e) => { if (e.componentType === 'xAxis' || e.componentType === 'yAxis') { myChart?.setOption({ tooltip: { alwaysShowContent: true, formatter: () => 'tooltip' } }) myChart?.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: e.dataIndex, position: [e.event?.offsetX, (e.event?.offsetY ?? 0) - 50] }) } })

myChart.on('mouseout', (e) => { if (e.componentType === 'xAxis' || e.componentType === 'yAxis') { myChart?.setOption({ tooltip: { alwaysShowContent: false, formatter: undefined } }) } })

if (option && typeof option === 'object') { myChart.setOption(option); }

window.addEventListener('resize', myChart.resize);`

Current Behavior

  1. When the heat map axis tooltip is triggered, the heat map is re-rendered and flickers.
  2. Triggering the heat map axis tooltip sometimes does not display, it seems because mouseover and mouseout are executed at the same time.

Expected Behavior

  1. When the heat map axis tooltip is triggered, the heat map keeps updating silently and eliminates flickering.
  2. How to avoid simultaneous execution of mouseover and mouseout logic in Echarts?

Environment

- OS: macOS 14.2.1
- Browser:Chrome 127.0.6533.120
- Framework: native javascript

Any additional comments?

No response

echarts-bot[bot] avatar Aug 27 '24 03:08 echarts-bot[bot]