You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Feature] Public API to get the laid-out rectangle of a grid #21780
The pixel rectangle of a grid (the plot, where the axes are drawn) is known only after ECharts has laid the chart out, and there is no public way to read it. Apps that draw HTML or SVG over a chart (hover labels, a crosshair line, markers, annotations) need it to put the overlay exactly on the plot.
This has been asked before (#16898, #16480) and answered with the private chart.getModel().getComponent('grid').coordinateSystem.getRect(); #16479 says getModel is private and may change. Everything public falls short:
chart.getOption().grid[0] holds the configured values (left, right, outerBoundsMode, ...), not the result of the layout, so it is wrong as soon as containLabel or outerBoundsMode: 'auto' shrink the plot.
chart.convertToPixel({ xAxisIndex: 0 }, extreme) needs the axis extent. After a dataZoom, or with scale / automatic ranges, only the model knows it ([Feature] How to get the axis range when datazoom scales it? #17919); getOption().xAxis[0].min/max still holds the configured values after a zoom.
chart.containPixel('grid', [x, y]) can find the edges by probing, but that is about log2(size) calls per edge on every layout change.
chart.getOption() deep-clones the whole option, data included, on every call, so it cannot be used on every mouse move.
Our case: a pointer drawn in HTML over several synced charts with a few thousand points each (labels at the points nearest to the mouse, a line across the plot and the time under it). It needs the plot's rectangle on every mouse move, so the read has to be cheap, and today it depends on a private method.
What does the proposed API look like?
A getter that mirrors the finders of containPixel and convertToPixel:
chart.getRect({gridIndex: 0});// -> { x: 70, y: 32, width: 460, height: 204 } in chart pixels, or null when the chart has no such grid or is not laid out yet
Or chart.getGridRect(gridIndex?); the name is open. What matters is that it is documented and stable, and that it gives the result of the layout (including outerBoundsMode and containLabel), which is what getRect() of the grid coordinate system holds today.
What problem does this feature solve?
The pixel rectangle of a grid (the plot, where the axes are drawn) is known only after ECharts has laid the chart out, and there is no public way to read it. Apps that draw HTML or SVG over a chart (hover labels, a crosshair line, markers, annotations) need it to put the overlay exactly on the plot.
This has been asked before (#16898, #16480) and answered with the private
chart.getModel().getComponent('grid').coordinateSystem.getRect(); #16479 saysgetModelis private and may change. Everything public falls short:chart.getOption().grid[0]holds the configured values (left,right,outerBoundsMode, ...), not the result of the layout, so it is wrong as soon ascontainLabelorouterBoundsMode: 'auto'shrink the plot.chart.convertToPixel({ xAxisIndex: 0 }, extreme)needs the axis extent. After a dataZoom, or withscale/ automatic ranges, only the model knows it ([Feature] How to get the axis range when datazoom scales it? #17919);getOption().xAxis[0].min/maxstill holds the configured values after a zoom.chart.containPixel('grid', [x, y])can find the edges by probing, but that is aboutlog2(size)calls per edge on every layout change.chart.getOption()deep-clones the whole option, data included, on every call, so it cannot be used on every mouse move.Our case: a pointer drawn in HTML over several synced charts with a few thousand points each (labels at the points nearest to the mouse, a line across the plot and the time under it). It needs the plot's rectangle on every mouse move, so the read has to be cheap, and today it depends on a private method.
What does the proposed API look like?
A getter that mirrors the finders of
containPixelandconvertToPixel:Or
chart.getGridRect(gridIndex?); the name is open. What matters is that it is documented and stable, and that it gives the result of the layout (includingouterBoundsModeandcontainLabel), which is whatgetRect()of the grid coordinate system holds today.