【发布时间】:2021-04-14 15:37:08
【问题描述】:
我正在使用 dc 创建一个折线图,其中容量在 y 轴上,周在 x 轴上。对于周,范围是 1-52,但没有第 2-40 周的数据。我只有第 1 周和第 41-52 周的数据,但是当没有数据时,我的折线图仍在创建一条线:
如果没有值,我如何获得它以便折线图会中断?所以它不会是一条连接线。这是我的参考代码
let chart = dc.lineChart("#chart");
let ndx = crossfilter(results);
let weekDimension = ndx.dimension(function (d) {
return d.week = +d.week;
});
function reduceAdd(p, v) {
++p.count;
p.total += v.capacity;
p.average = p.total / p.count;
return p;
}
function reduceRemove(p, v) {
--p.count;
p.total -= v.capacity;
p.average = p.count ? p.total / p.count : 0;
return p;
}
function reduceInitial() {
return { count: 0, total: 0, average: 0 };
}
let capacityGroup = weekDimension.group().reduce(reduceAdd, reduceRemove, reduceInitial);
chart.width(360)
.height(200)
.margins({ top: 20, right: 20, bottom: 50, left: 30 })
.mouseZoomable(false)
.x(d3.scale.linear().domain([1, 52]))
.renderHorizontalGridLines(true)
.brushOn(false)
.dimension(weekDimension)
.valueAccessor(function (d) {
return d.value.average;
})
.group(capacityGroup);
dc.renderAll('chart');
这就是results 的样子
{month : "1", capacity: "48"}
{month : "1", capacity: "60"}
{month : "42", capacity: "67"}
{month : "42", capacity: "60"}
{month : "43", capacity: "66"}
{month : "44", capacity: "52"}
{month : "45", capacity: "63"}
{month : "46", capacity: "67"}
{month : "47", capacity: "80"}
{month : "48", capacity: "61"}
{month : "48", capacity: "66"}
{month : "49", capacity: "54"}
{month : "50", capacity: "69"}
我尝试添加 .defined(d => { return d.y != null; }); 和 .defined(d => !isNaN(d.value)); 但这没有任何作用...任何帮助将不胜感激
【问题讨论】:
-
您的数组中有
d.y == null的数据点吗?如果不是,如何知道缺少某个值的尺度? -
@AndrewReid 所说的:dc.js 只会显示它收到的数据。它不知道“应该”那里有哪些数据。 Here is a related question,区别在于你想用
null而不是0来填充。 -
啊,这很有道理...@Gordon 我如何将它合并到我的代码中?
-
这是一个假组,因此您可以使用该函数包装您的组,然后再将其传递给图表。如果您无法弄清楚,请编辑您的问题并添加足够的内容以重现您目前所拥有的内容(最好是 fiddle、bl.ock 或其他笔记本,或至少是示例数据)。如果你这样做,我会发布一个答案。
-
@Gordon 我用我的代码的样子编辑了我的问题 -- 如果你需要其他任何东西,请告诉我!
标签: javascript d3.js dc.js crossfilter linegraph