D3.js 对数时标
如何在D3中制作对数日期时间刻度 简单的时间刻度如下所示:D3.js 对数时标,d3.js,D3.js,如何在D3中制作对数日期时间刻度 简单的时间刻度如下所示: d3.time.scale() .domain([new Date(2014, 0, 1), new Date()]) .range([0, 500]) 简单的对数刻度如下所示: d3.scale.log() .domain([new Date(2014, 0, 1), new Date()]) .rangeRound([0, 500]) .base(10) 试图以各种方式链接它们的语法,但没有效果 图表将按上次登录日期定位用户。射
d3.time.scale()
.domain([new Date(2014, 0, 1), new Date()])
.range([0, 500])
简单的对数刻度如下所示:
d3.scale.log()
.domain([new Date(2014, 0, 1), new Date()])
.rangeRound([0, 500])
.base(10)
试图以各种方式链接它们的语法,但没有效果
图表将按上次登录日期定位用户。射程约为一年。如果我们线性分配数据,大多数用户将在最后几天/几小时内发生冲突。用对数我们可以放大最后几个小时
解决方案可以是交互式缩放或几个图表。但这里的目标是制作一张静态图表,其中包含一年的非线性概览
另一种选择是将datetime转换为“从现在算起的天数”,这是一个数字。这对数据有用。但是我不知道如何标记轴刻度,比如“01-01-2014”…创建两个刻度,然后一个接一个地使用。首先使用时间刻度,而不是对数或功率刻度
var parseDate = d3.time.format("%Y-%m-%d").parse;
var x = d3.time.scale()
.range([0,width]);
var xLog = d3.scale.pow().exponent(4)
.domain([1,width])
.range([0,width]);
然后我使用.forEach获得线性点:
x.domain(d3.extent(data, function(d) { return parseDate(d.start); }));
data.forEach(function(d) {
d.start = x(parseDate(d.start));
});
绘制对象时,我添加对数比例:
.attr('cx', function (d) { return xLog(d.start)})
像下面这样的东西似乎愚弄了d3js,使其认为它有一个真正的缩放对象。它应该是一个良好的起点:
var xt = d3.scaleUtc()
.domain([start, now])
.range([1, width])
var xp = d3.scalePow()
.exponent(2)
.domain([1, width])
.range([0, width])
// Fool d3js into thinking that it is looking at a scale object.
function x_copy() {
var x = function(t) { return xp(xt(t)) }
x.domain = xt.domain
x.range = xp.range
x.copy = x_copy
x.tickFormat = xt.tickFormat
x.ticks = xt.ticks
return x
}
x = x_copy()
var xAxis = d3.axisBottom(x)
我想你必须手工定制时间刻度。有关将时间刻度自定义为非连续日期的信息,请参见()。您是如何解决此问题的?