如何在D3.js中创建轴刻度标签超链接

时间:2013-11-11 19:46:30

标签: javascript d3.js

在D3.js中,如何将HTML元素/属性分配给刻度标签?我特别感兴趣的是使它们成为超链接,但它可以概括为制作图像,或者像交替的div类那样奇怪。

var data = [{"count": 3125,"name": "aaa"}, {"count": 3004,"name": "bbb"}...

y = d3.scale.ordinal()
    .rangeRoundBands([0, height], 0.1)
    .domain(data.map(function (d) {
      return d.name;
    }))

yAxis = d3.svg.axis().scale(y)
vis.append("g")
   .attr("class", "y axis")
   .call(yAxis)

http://jsfiddle.net/SFDrv/

所以在JSfiddle中,我如何链接到www.example.com/aaa,www.example.com/bbb,www.example.com/ccc等?

2 个答案:

答案 0 :(得分:3)

对于您发布的JSfiddle,您可以创建所有text的字符串选择(这些是y轴标记),然后使用.on("click", function)链接每个标签。这是一个有效的例子:

d3.selectAll("text")
    .filter(function(d){ return typeof(d) == "string"; })
    .style("cursor", "pointer")
    .on("click", function(d){
        document.location.href = "http://www.example.com/" + d;
    });

我分叉你的JSFiddle并在那里有完整的例子:http://jsfiddle.net/mdml/Qm9U7/

更好的解决方案是使用y轴值数组并使用它们来过滤文档中的text元素,而不是测试每个text元素的数据是否为字符串。然而,最好的方法取决于代码的其余部分,因此它可能因应用程序而异。

答案 1 :(得分:0)

要创建包含图像的轴,您需要自己创建它们而不使用d3.svg.axis()。这会创建具有特定宽度的浮动li标记...

// generate axis
x = d3.scale.linear().range([min, max]).domain([minValue, maxScaleValue]);
xAxis = d3.scale.identity().domain([minValue, maxScaleValue]);
var ticks = xAxis.ticks(10);
if (ticks.length) {
    var tickDiff = Math.abs(ticks[1] - ticks[0]);
    scope.legend
        .selectAll('li')
        .data(ticks)
        .enter()
        .append('li')
        .text(xAxis)
        .style('width', x(tickDiff));
}
scope.legend
    .selectAll("li")
    .data(ticks)
    .exit()
    .remove();

还有useful article about d3 axis对我帮助很大。