LightningChart JS - LineSeries / Progressive X 的损坏

2024-06-29

我在使用 LightningChart 时遇到了一个有趣的问题,它似乎会破坏或以其他方式减少我的数据,具体取决于它与图表的 DateOrigin 的距离。我的数据是每秒 1000 个样本,我试图一次显示 1-2 周的数据。我正在使用 ChartXY 类,x 轴类型设置为“线性高精度”,其精度应为 1 毫秒,这就是我所需要的,我不再需要了,我正在创建一个 LineSeries 及其数据模式是“ProgressiveX”并且常规ProgressiveStep:true。

这是在 DateOrigin 附近绘制数据时的样子。

这是放大 DateOrigin 附近数据的样子。

看起来棒极了!闪电图正是我想要的!

但是,我希望正确偏移此数据以显示它是真正的绝对时间。

这是我将此数据偏移 14 天后的样子。我设置相对偏移量的代码如下所示。

ds.addArrayY(curve.data,step=1,start=14*24*60*60*1000)

好吧,缩小后看起来还不错,但是如果我们放大呢?

已经失控了!看起来 X 轴值被强制为 X 轴的某个更大的步长。距离 DateOrigin 越远,情况就会变得更糟。我担心这是引擎的一些内置行为,我期望太多,但是,它说它有 1 毫秒的分辨率,所以我希望这一点得到尊重。

这是我创建图表的方法。

// Create a Line Chart.
const PumpsChart = lightningChart().ChartXY({
    // Set the chart into a div with id, 'target'. 
    // Chart's size will automatically adjust to div's size. 
    theme: Themes.lightGradient,
    container: 'PumpsChart',
    defaultAxisX: {
        type: 'linear-highPrecision'
    }
}).setTitle('') // Set chart title
.setTitleFont(new FontSettings({
    family: waveChartFontFamily,
    size: 20
}))
.setMouseInteractionWheelZoom(false)

axisPumpsChartDateTime = PumpsChart.getDefaultAxisX()
.setTickStrategy(
    AxisTickStrategies.DateTime, 
    (tickStrategy) => tickStrategy.setDateOrigin(waveDateOrigin))

axisPumpsChartPressurePSI = PumpsChart.getDefaultAxisY()
    .setTitle("Pressure (PSI)")
    .setInterval(0,10000,0,true)

这是我创建 LineSeries 的方法

newDataSeries = targetChart.chart.addLineSeries(
                                    { 
                                        yAxis: targetChart.axis,
                                        dataPattern: {
                                            pattern: 'ProgressiveX',
                                            regularProgressiveStep: true,
                                        }
                                     }
                                );

以下是我向图表添加数据的方法:

ds.addArrayY(curve.data,step=1,start=14*24*60*60*1000)

我不想使用 AxisTickStrategies.DateTime 而不是 AxisTickStrategies.DateTime 有几个原因,我的数据跨度数周,100 小时太少,我对毫秒分辨率很好,我不需要更多,而且我需要以相对而非绝对时间呈现我的数据。

希望我遗漏了一些参数,我可以调整它们来实现这一目标。

EDIT

嗯,当数据相对于原点 -636 小时偏移时,时间刻度策略也会发生这种损坏。我在将 ProgressiveX 设置为 DataPattern.pattern 的情况下尝试了此操作。

**** 编辑 2 ****

好吧,我什至尝试将采样率降低到每秒 20 个样本,并将其改回 AxisTickStrategies.DateTime,出于某种原因,它将所有点“压缩”到这个神奇的 0.25 秒间隔。


难道是32位浮点精度损失?两周相当于1 209 600, and log2(1_209_600) = 20.2 = 21 bits的存储空间。 32 位二进制浮点数的尾数只有 23 位,剩下 2 位用于小数部分,这可以解释 0.25 的增量。

因此,如果我是正确的,您需要将 X 位置精度提高到 64 位浮点数。您已经在使用"linear-highPrecision"轴模式 https://lightningchart.com/lightningchart-js-api-documentation/v3.4.0/interfaces/axisoptions.html#type不过,这将是我对解决方案的第一个猜测,据我所知,它实际上并没有将数据精度提高到 64 位,而只是将轴提高到了 64 位。除非我错过了另一个解决方案,否则您可能需要将数据拆分为单独的系列。

EDIT:我实际上不确定这是否是 LightningChart 端的问题,现在我已经查过了。 OpenGL ES 3.0(WebGL 2 依赖于此,LightningChart 也依赖于此)要求“高精度”浮点参数存储在二进制 32 IEEE 754 标准浮点中 https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2.

官方规格,p。 53 https://registry.khronos.org/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf#page=60:

highp 浮点值以 IEEE 754 单精度浮点格式存储。 Mediump 和 lowp 浮点值具有如下详述的最小范围和精度要求,并且具有 IEEE 754 定义的最大范围和精度。

因此,鉴于该信息,这似乎是 LCjs 中的错误导致了 WebGL 技术限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LightningChart JS - LineSeries / Progressive X 的损坏 的相关文章

随机推荐