Highcharts - 我的数据是什么导致 "setExtremes" 无法正常工作?

Highcharts - what is it about my data that causes "setExtremes" to not work correctly?

我正在构建一个甘特里程碑图表,显示多个项目的某些里程碑,每个项目都可以被视为一个“组”的一部分。

图表最初加载时,我显示所有项目,并通过调用 chart.xAxis[0].setExtremes().[= 将“今年”的 1 月 1 日自定义缩放级别设置为未来五年的 1 月 1 日37=]

有一个允许按项目组过滤的控件。每次进行新的过滤 selection 时,图表都会重新加载,并且我将缩放比例重置为相同的范围。

但是,对于某些数据,setExtremes 未得到遵守,并且 Highcharts 自行决定要显示的范围,我不明白为什么。特别是因为如果我显示来自一组的数据(例如“第 4 组”),缩放会受到尊重,但是如果我添加到另一组(例如显示“第 4 组”“组2"),不考虑缩放。

但是 - 如果我用不同的数据集尝试同样的事情(例如显示“第 5 组”,然后添加“第 2 组”),那么在添加似乎是“可疑”数据。

非常混乱。

我设置了一个 code sandbox 使用假项目和组名称,但使用实际日期数据。

如果您在编辑器外部加载沙箱,也可能更容易查看:https://g26rq.csb.app/

导致此行为的数据是什么?


更新以解决评论:

所有需要的数据都是在初始组件安装时从服务器获取的,并以一种我可以在过滤器设置更改时从中提取的方式存储在状态中,这样我就不必继续返回服务器.

也就是说,操作顺序是这样设置的:

  1. 组过滤器 select 控件上的任何“更改”事件都会以 Highcharts 图表组件应 unmounted/destroyed 的方式设置整体组件状态。 (基本上我存储系列数据的状态位是cleared/emptied。)
  2. 所有 selection 完成后,select 控件上的“blur”事件开始处理数据 transformation/application。
  3. 从state整体数据存放处拉取filter设置对应的数据,转化为需要的Highcharts系列格式,然后将series数据设置成状态。
  4. 组件重新呈现状态中的系列数据后,允许呈现 Highcharts 组件,我在 Highcharts 组件属性中指定了一个回调函数,它对应于一个 chart.events.load 事件处理程序。由于之前的图表已被销毁,现在基本上正在重新创建,因此将发生 load 事件。
  5. callback/load 事件处理程序调用 setExtremes

我看到添加到 render 事件的 console.log 发生在 console.log 我放入我调用 setExtremes 的函数之后,但那是预期的。根据关于 load and render 事件的 Higcharts 文档:

load: Highcharts.ChartLoadCallbackFunction

Fires when the chart is finished loading.

...

There is also a second parameter to the chart constructor where a callback function can be passed to be executed on chart.load.

(我猜 Highcharts React 组件正在使用它来传递我在组件的 callback 属性中指定的回调函数。)

render: Highcharts.ChartRenderCallbackFunction

Fires after initial load of the chart (directly after the load event), and after each redraw (directly after the redraw event).

所以 render 在我 setExtremes 之后发生也就不足为奇了,但这并不一定意味着我在图表准备好之前调用 setExtremes。考虑到每次过滤器设置更改时我都是 destroying/re-creating 图表,并且 render 可能会被用户的任何手动缩放更改触发(更不用说可能在我自己强制 setExtremes),在我看来,load 事件中的 setExtremes 正是它应该发生的地方。

我仔细研究了这个问题,它似乎与 xAxis minRange 属性 有关,因为默认情况下它被计算为:

The default minRange for the x axis is five times the smallest interval between any of the data points.

所以您的极端情况不适合某些数据集。

演示:https://jsfiddle.net/BlackLabel/mnfb3pv1/

作为解决方案,您可以将 minRange 设置为某个固定值:

演示:https://jsfiddle.net/BlackLabel/pu60fkaL/

你的演示集 minRangehttps://codesandbox.io/s/gantt-wrong-zoom-forked-b5dhl?file=/src/App.js

API: https://api.highcharts.com/highstock/xAxis.minRange