D3 非连续日期域在 X 轴上产生间隙
D3 Non-Continuous Dates Domain Gives Gaps on X-Axis
我想绘制一些不连续的时间序列数据(周末、节假日等的日期间隔)。是每天的数据。
数据类似于:
date,value
1/2/15,109.33
1/5/15,106.25
1/6/15,106.26
1/7/15,107.75
1/8/15,111.89
1/9/15,112.01
1/12/15,109.25
1/13/15,110.22
...
所以我定义了我的 x
和 y
scales
:
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);
并根据我的源数据设置域:
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain(d3.extent(data, function(d) { return d.value; }));
但是,问题是我的日期有间隔。我的 x 轴现在包括那些缺失的日期(我猜 d3.time.scale()
自动执行此操作是因为它映射到一个连续的范围?)。
.extent()
在 date
中找到最大值和最小值,然后 .domain()
return 将这些最大值和最小值作为 x 轴的范围。但我不确定如何处理间隙和 return 非间隙日期范围。
所以我的问题是:如何让我的 x 轴范围只包含数据集中的日期?而不是 "fill in the blanks"。我应该玩 d3.time.scale().range()
吗?还是我需要使用不同的 scale
?
正确的做法是什么?有人可以指出我正确的方向或举一些例子吗?谢谢!
另外,我想用普通的 d3 和 javascript 来解决。我对使用任何第 3 方抽象库不感兴趣。
正如 Lars Kotthof 指出的那样,您可以创建一个有序的 x 轴,"looks" 就像一个时间尺度。
假设您想将时间序列绘制成一条线,下面是一个示例:http://jsfiddle.net/ee2todev/3Lu46oqg/
如果您想自定义日期格式,例如将日期表示为(星期几)日和月,您必须先将字符串转换为日期。
我添加了一个以通用德语格式格式化日期的示例。但是您可以轻松地根据需要调整代码。
http://jsfiddle.net/ee2todev/phLbk0hf/
最后但同样重要的是,您可以使用
axis.tickValues([values])
选择要显示的日期。也可以看看:
https://github.com/mbostock/d3/wiki/SVG-Axes#tickFormat
d3fc-discontinuous-scale 组件适应任何其他尺度(例如 d3 时间尺度)并添加不连续性的概念。
这些不连续性是通过 'discontinuity provider' 内置的 discontinuitySkipWeekends
允许您跳过周末来确定的。
这是一个例子:
const skipWeekendScale = fc.scaleDiscontinuous(d3.scaleTime())
.discontinuityProvider(fc.discontinuitySkipWeekends());
这是一个完整的演示:https://bl.ocks.org/ColinEberhardt/0a5cc7ca6c256dcd6ef1e2e7ffa468d4
我想绘制一些不连续的时间序列数据(周末、节假日等的日期间隔)。是每天的数据。
数据类似于:
date,value
1/2/15,109.33
1/5/15,106.25
1/6/15,106.26
1/7/15,107.75
1/8/15,111.89
1/9/15,112.01
1/12/15,109.25
1/13/15,110.22
...
所以我定义了我的 x
和 y
scales
:
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);
并根据我的源数据设置域:
x.domain(d3.extent(data, function(d) { return d.date; }));
y.domain(d3.extent(data, function(d) { return d.value; }));
但是,问题是我的日期有间隔。我的 x 轴现在包括那些缺失的日期(我猜 d3.time.scale()
自动执行此操作是因为它映射到一个连续的范围?)。
.extent()
在 date
中找到最大值和最小值,然后 .domain()
return 将这些最大值和最小值作为 x 轴的范围。但我不确定如何处理间隙和 return 非间隙日期范围。
所以我的问题是:如何让我的 x 轴范围只包含数据集中的日期?而不是 "fill in the blanks"。我应该玩 d3.time.scale().range()
吗?还是我需要使用不同的 scale
?
正确的做法是什么?有人可以指出我正确的方向或举一些例子吗?谢谢!
另外,我想用普通的 d3 和 javascript 来解决。我对使用任何第 3 方抽象库不感兴趣。
正如 Lars Kotthof 指出的那样,您可以创建一个有序的 x 轴,"looks" 就像一个时间尺度。 假设您想将时间序列绘制成一条线,下面是一个示例:http://jsfiddle.net/ee2todev/3Lu46oqg/
如果您想自定义日期格式,例如将日期表示为(星期几)日和月,您必须先将字符串转换为日期。 我添加了一个以通用德语格式格式化日期的示例。但是您可以轻松地根据需要调整代码。 http://jsfiddle.net/ee2todev/phLbk0hf/
最后但同样重要的是,您可以使用
axis.tickValues([values])
选择要显示的日期。也可以看看: https://github.com/mbostock/d3/wiki/SVG-Axes#tickFormat
d3fc-discontinuous-scale 组件适应任何其他尺度(例如 d3 时间尺度)并添加不连续性的概念。
这些不连续性是通过 'discontinuity provider' 内置的 discontinuitySkipWeekends
允许您跳过周末来确定的。
这是一个例子:
const skipWeekendScale = fc.scaleDiscontinuous(d3.scaleTime())
.discontinuityProvider(fc.discontinuitySkipWeekends());
这是一个完整的演示:https://bl.ocks.org/ColinEberhardt/0a5cc7ca6c256dcd6ef1e2e7ffa468d4