连接chart.js中缺失数据之间的点

use*_*612 9 chart.js

我正在使用chart.js,并且在我的图表中的某些点上,我在多天条目之间有一些缺失的数据.我已将这些值指定为null,但希望图表在缺失点之间绘制连接线.这是我有的:

在此输入图像描述

有没有办法连接chart.js中的点?或者也许有人可以指向我可以的图表库.谢谢.

Sel*_*lay 32

新版本支持跳过丢失的数据.您可以在选项中设置spanGaps:true.然后,如果您有缺失数据的null或NaN,它将跳过它并连接到下一个点.

.....
 showTooltips: true,
        options: {
             spanGaps: true,
  ......
Run Code Online (Sandbox Code Playgroud)

文档在这里

  • @Ian,您好,有一个问题:github.com/chartjs/Chart.js/issues/5956 问题是您实际上可以为 spanGaps 做破折号,但有一个技巧。诀窍是提供同一数据集的两个副本,其中一个带有 borderDash (chartjs.org/docs/latest/charts/line.html#line-styling) 和 spanGaps true ,这将用破折号绘制整个图表,然后用没有 borderDash 和 spanGaps 将在除间隙区域之外的虚线上绘制实线。所以最终的结果将是你想要的。 (2认同)

小智 10

对于 charts.js v2,您只需在数据集中定义它:

var data = {
labels: labels,
datasets: [ {
    backgroundColor: "#94b5c244",
    borderColor: "#94b5c2",
    data: data,
    label: "AAPL",
    spanGaps: true
}]
};    
Run Code Online (Sandbox Code Playgroud)


Cal*_*ero 5

我有同样的问题,我已经修改了这个版本:

                    var lastPoint = null;
                helpers.each(dataset.points, function (point, index) {

                    if (!point.ignore && dataset.skipNullValues && lastPoint) {
                        ctx.beginPath();
                        ctx.moveTo(lastPoint.x, lastPoint.y);

                        if (this.options.bezierCurve) {
                            ctx.bezierCurveTo(
                                lastPoint.controlPoints.outer.x,
                                lastPoint.controlPoints.outer.y,
                                point.controlPoints.inner.x,
                                point.controlPoints.inner.y,
                                point.x,
                                point.y
                            );
                        } else {
                            ctx.lineTo(point.x, point.y);
                        }
                        ctx.stroke();
                    }

                    if (index > 0 && !dataset.points[index - 1].ignore && !point.ignore) {
                        if (this.options.bezierCurve) {
                            ctx.bezierCurveTo(
                                dataset.points[index - 1].controlPoints.outer.x,
                                dataset.points[index - 1].controlPoints.outer.y,
                                point.controlPoints.inner.x,
                                point.controlPoints.inner.y,
                                point.x,
                                point.y
                            );
                        }
                        else {
                            ctx.lineTo(point.x, point.y);
                        }

                        lastPoint = point;
                    }
                    else if (index === 0 || !point.ignore) {
                        ctx.moveTo(point.x, point.y);

                        if (!point.ignore) {
                            lastPoint = point;
                        }
                    }

                }, this);
Run Code Online (Sandbox Code Playgroud)

为了更好的结构,我为数据集设置了一个名为"skipNullValues"的属性:

            var datasetObject = {
                label: dataset.label || null,
                fillColor: dataset.fillColor,
                strokeColor: dataset.strokeColor,
                pointColor: dataset.pointColor,
                pointStrokeColor: dataset.pointStrokeColor,
                tooltip: dataset.tooltip,
                line: dataset.line,
                fill: dataset.fill,
                points: [],
                skipNullValues: dataset.skipNullValues
            };
Run Code Online (Sandbox Code Playgroud)

是完整的工作版本!

也许有一个更好的解决方案,但对我的用途它是有效的.

如果它适合您,请告诉我!