在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)
所以在JSfiddle中,我如何链接到www.example.com/aaa,www.example.com/bbb,www.example.com/ccc等?
答案 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对我帮助很大。