javascript - 如何在不在 SVG 中渲染的情况下从 d3 中获取轴刻度?

标签 javascript d3.js

我正在使用 Canvas 实现二维图表。我想重用 d3 的逻辑来生成图表的轴。 d3 在生成轴方面做了很多出色的工作,我想利用它。

(注意:出于向后兼容的原因,我暂时坚持使用 d3v3。)

考虑以下 d3 代码:

let scale = d3.time.scale()
    .range([0, width])
    .domain([lo, hi]);
let axis = d3.svg.axis()
    .scale(scale)
    .ticks(num_ticks)
    .tickSize(10)
    .orient("bottom");

我可以将其渲染到图表 div 中:

svg.selectAll('.x-axis').call(axis);

我希望能够以编程方式从 axis 中获取刻度数据,包括格式化的标签,方法是编写一个行为如下的函数:

ticks = get_axis_ticks(axis)

ticks 应该包含每个刻度位置(在这种特殊情况下作为 Date)和相应的 d3 生成的标签。

[[Date(...), "Wed 19"],
 [Date(...), "Fri 21"],
 [Date(...), "Apr 23"],
 [Date(...), "Tue 25"],
 ...]

然后我可以使用这些数据在我的 Canvas 上绘制一个轴。

我已经深入研究了 d3v3 源代码(特别是此处:https://github.com/d3/d3/blob/v3.5.17/src/svg/axis.js),但我发现很难将逻辑与 SVG 操作分开。

非常感谢您的帮助。

最佳答案

我的一个想法是使用您创建的缩放函数来生成您想要的刻度并将它们推送到一个数组中。

作为一个非常简单的示例,如果您想要 10 个刻度,每个刻度以 1 为单位递增,您可以这样做:https://jsfiddle.net/Q5Jag/3148/

//define dummy values
var lo = 1;
var hi = 10;
var width = 512
var scale = d3.time.scale()
    .range([0, width])
    .domain([lo, hi]);

//define your function
var get_x_axis = function() {
    let axisArr = [];
    for(var i = 0; i < 10; i++ ) {
    //calculate your value
    axisArr.push(scale(i))
  }
  return axisArr
}

//call it
let axisTicks = get_x_axis()

//log it
console.log(axisTicks)

我不确定这是否是您要找的,但如果您需要进一步的帮助,请直接询问。

关于javascript - 如何在不在 SVG 中渲染的情况下从 d3 中获取轴刻度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47424455/

相关文章:

javascript - 奇怪的 JavaScript 数组行为。可以修复吗?

php - 如何将我的 php 变量传递给 javascript

javascript - 如何在不缩放绑定(bind)到时间轴的其他形状的情况下放大/缩小 d3.time.scale

javascript - 如何显示不连续折线图

javascript - 在一页上实现多个照片盒图库

javascript - Node.js:如何解决终端 UI 中的异步日志重叠?

javascript - D3js 单条形图通过 slider 更新

javascript - D3 图表似乎超出了 x 轴(画笔效果的裁剪问题)

javascript - 在 d3 中为每个数据元素添加多个矩形

DataTables rowReordering (ASP.Net MVC) 期间的 JavaScript 运行时错误