当 x 间隔缩短时,是什么导致 d3js 停止画线?
What is causing d3js to stop drawing a line when x interval shortens?
这是一个奇怪的错误;很难解释所以请耐心等待。我有一些从数据库中查询的数据,这些数据通常是 60 秒的一部分。但是,如果我插入一大堆不在 60 秒内的数据(比如相隔 0-1 秒);当查询这个数据时,d3js 对 60 秒部分的数据画线很好,但是当它遇到间隔不是 60 秒的新数据时,它停止画线;见下文:
红点是鼠标悬停,表示确实有数据;这一直发生在 "invisible" 区域(点所在的位置)。左边有一条清晰可见的线;此数据相隔 60 秒。如果我将数据输入减慢到 60 秒,则线条会返回(但不是间隔 0-2 秒的区域)。
这是我的一些来源:
var xScale = d3.time.scale(); // time series
var yScale = d3.scale.linear(); // our float/int data points
var xAxis = d3.svg.axis();
var yAxis = d3.svg.axis();
var vline = d3.svg.line(); // our data will use this line
var varea = d3.svg.area(); // our data will fill this area
xScale
.domain(d3.extent(data, function(d) { return parseDate(d.x); }))
.range([0, width]);
yScale
.domain([0, d3.max(data, function(d) {
if (config.dtype == "%") {
return 100;
} else if (d.y >= 1) {
return d.y;
}
return 1;
})])
.range([height,0]);
xAxis
.scale(xScale)
.orient("bottom")
.ticks(12)
.innerTickSize(-height)
.outerTickSize(-height)
.tickPadding(3);
yAxis
.scale(yScale)
.orient("left")
.ticks(5)
.innerTickSize(-width)
.outerTickSize(-width)
.tickPadding(3)
.tickFormat(d3.format(",.2f"));
vline
.defined(function(d) { return d.y != null; })
.x(function(d) { return xScale(parseDate(d.x)); })
.y(function(d) { return yScale(d.y); });
varea
.defined(function(d) { return d.y != null; })
.x(function(d) { return xScale(parseDate(d.x)); })
.y0(height)
.y1(function(d) { return yScale(d.y); });
有人知道为什么要这样做吗?
您正在使用 d3.line.defined
,基本上可以在您的行中生成 "hole"。 (See doc)
the generated path data will automatically be broken into multiple distinct subpaths, skipping undefined data.
查看此示例,与您发布的示例完全相同:http://bl.ocks.org/mbostock/3035090
即使鼠标所在的位置有数据,如果它是一个被未定义值包围的孤立点,则不会绘制线/区域,因为它需要两个连续的数据点来绘制线/区域。
这是一个奇怪的错误;很难解释所以请耐心等待。我有一些从数据库中查询的数据,这些数据通常是 60 秒的一部分。但是,如果我插入一大堆不在 60 秒内的数据(比如相隔 0-1 秒);当查询这个数据时,d3js 对 60 秒部分的数据画线很好,但是当它遇到间隔不是 60 秒的新数据时,它停止画线;见下文:
红点是鼠标悬停,表示确实有数据;这一直发生在 "invisible" 区域(点所在的位置)。左边有一条清晰可见的线;此数据相隔 60 秒。如果我将数据输入减慢到 60 秒,则线条会返回(但不是间隔 0-2 秒的区域)。
这是我的一些来源:
var xScale = d3.time.scale(); // time series
var yScale = d3.scale.linear(); // our float/int data points
var xAxis = d3.svg.axis();
var yAxis = d3.svg.axis();
var vline = d3.svg.line(); // our data will use this line
var varea = d3.svg.area(); // our data will fill this area
xScale
.domain(d3.extent(data, function(d) { return parseDate(d.x); }))
.range([0, width]);
yScale
.domain([0, d3.max(data, function(d) {
if (config.dtype == "%") {
return 100;
} else if (d.y >= 1) {
return d.y;
}
return 1;
})])
.range([height,0]);
xAxis
.scale(xScale)
.orient("bottom")
.ticks(12)
.innerTickSize(-height)
.outerTickSize(-height)
.tickPadding(3);
yAxis
.scale(yScale)
.orient("left")
.ticks(5)
.innerTickSize(-width)
.outerTickSize(-width)
.tickPadding(3)
.tickFormat(d3.format(",.2f"));
vline
.defined(function(d) { return d.y != null; })
.x(function(d) { return xScale(parseDate(d.x)); })
.y(function(d) { return yScale(d.y); });
varea
.defined(function(d) { return d.y != null; })
.x(function(d) { return xScale(parseDate(d.x)); })
.y0(height)
.y1(function(d) { return yScale(d.y); });
有人知道为什么要这样做吗?
您正在使用 d3.line.defined
,基本上可以在您的行中生成 "hole"。 (See doc)
the generated path data will automatically be broken into multiple distinct subpaths, skipping undefined data.
查看此示例,与您发布的示例完全相同:http://bl.ocks.org/mbostock/3035090
即使鼠标所在的位置有数据,如果它是一个被未定义值包围的孤立点,则不会绘制线/区域,因为它需要两个连续的数据点来绘制线/区域。