我试图绘制一个折线图作为堆叠,因为有一些丢失的数据-我认为spanGaps将是一个很好的选择-但它看起来像这样的作品,如果它的“顶”线,但如果差距存在(即。data: [20, undefined, 21, 22, 25, 26, 24, 28, 30, 25, 22],
),则会导致顶部的堆叠出现问题。
这是一个bug,还是有办法解决这个问题(除了尝试基于已知值创建临时虚拟值等)?
var config_working = {
type: 'line',
data: {
labels: ['01 May 2023', '02 May 2023', '03 May 2023', '04 May 2023', '05 May 2023', '06 May 2023', '07 May 2023', '08 May 2023', '09 May 2023', '10 May 2023'],
datasets: [{
label: 'Full History',
borderColor: '#3182BD',
backgroundColor: '#3182BD',
data: [20, 15, 21, 22, 25, 26, 24, 28, 30, 25, 22],
// Count is 11
fill: true
},{
label: 'Gappy data',
borderColor: '#2c6145',
backgroundColor: '#2c6145',
data: [15, 14, 12, undefined, undefined, undefined, undefined, 12, 10, 14, 15],
// Count is 11
fill: true
}]
},
options: {
type: 'line',
spanGaps: true,
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
stacked: true
}
}
}
};
var config_problem = {
type: 'line',
data: {
labels: ['01 May 2023', '02 May 2023', '03 May 2023', '04 May 2023', '05 May 2023', '06 May 2023', '07 May 2023', '08 May 2023', '09 May 2023', '10 May 2023'],
datasets: [{
label: 'History with one gap',
borderColor: '#3182BD',
backgroundColor: '#3182BD',
data: [20, undefined, 21, 22, 25, 26, 24, 28, 30, 25, 22],
// Count is 11
fill: true
},{
label: 'Gappy data',
borderColor: '#2c6145',
backgroundColor: '#2c6145',
data: [15, 14, 12, undefined, undefined, undefined, undefined, 12, 10, 14, 15],
// Count is 11
fill: true
}]
},
options: {
type: 'line',
spanGaps: true,
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
stacked: true
}
}
}
};
window.onload = function() {
var ctx = document.getElementById('cvs-working').getContext('2d');
window.myLine = new Chart(ctx, config_working);
var ctx = document.getElementById('cvs-problem').getContext('2d');
window.myLine = new Chart(ctx, config_problem);
};
h1 {
border-top:solid 1px black;
}
<script type='text/JavaScript' src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<h1>
Working(?)...
</h1>
<div style='height:300px'>
<canvas id='cvs-working'></canvas>
</div>
<h1>
Problem...
</h1>
<div style='height:300px'>
<canvas id='cvs-problem'></canvas>
</div>
(注意,tbh,我不确定“工作?......”一个也在工作-因为它似乎没有跨越蓝色系列差距)
一个jsfiddle也可以用来玩... https://jsfiddle.net/Abeeee/s07fkh69/65/
1条答案
按热度按时间fgw7neuy1#
首先,我发现第一个图表如预期的那样工作,第二行所在的值正是它们应该的值:
[35, 29, 33,----,40,40,39,37]
。如果将beginAtZero: true
添加到y轴上,可能会更容易看到(参见下面的示例)。至于不工作的版本,这似乎是默认行为,我在其他库中看到过(例如echarts,参见this SO post)。如果我想得更多,我会得出这样的结论:这是有原因的,我不会再称之为bug了:
spanGaps
,我们所做的就是 * 忽略 * 一个非数字值,在一个间隙上绘制一个线段,因为它是 * 缺失 * 的。spanGaps
应该做的要多。尽管如此,插值行为仍然可以(并且不是非常复杂)在chartjs代码中实现。
它也可以在一定程度上在用户领域中实现。下面是对
LineController
的扩展,我称之为LineControllerWithGapInterpolation
,其中id
line_with_gap_interpolation
(用作图表或数据集的类型)。它有一些局限性:它只适用于直线(没有样条插值,
tension
选项被忽略),并且它需要定义所有的x值(因此我将第11天添加到您的示例中)。