D3.js 对数时标

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中制作对数日期时间刻度

简单的时间刻度如下所示:

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)

我想你必须手工定制时间刻度。有关将时间刻度自定义为非连续日期的信息,请参见()。您是如何解决此问题的?