D3.js:使用图像(使用数据中指定的文件名)作为轴上的刻度值
我目前有这个数据:
var dataset = [ { "bank": "Bank 1", "img": "Picture1.png" }, { "bank": "Bank 2", "img": "Picture2.png" }, { "bank": "Bank 3", "img": "Picture3.png" } ];
复杂的现实世界的数据,对吗? 当然。 好吧,我目前有“ 银行 ”作为我的轴上的这个D3.js代码的tick值:
var w = 1000; var h = 700; var padding = 30; var wpadding = 120; var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h+padding); var yScale = d3.scale.ordinal() .domain(dataset.map(function (d) { return d.bank; })) .rangeRoundBands([0, h], 0.55); var yAxis = d3.svg.axis() .scale(yScale) .orient("left"); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + wpadding + ", 0)") .call(yAxis);
无论如何,我确信你可以看到我要去哪里。 我现在试图让我的坐标轴上的刻度值引用数据集中的img值,而不仅仅是银行值。
起初,我以为这是一个使用axis.tickValues([值])与匿名函数引用我的JSON数据中的img值的情况下,但它不起作用。 或者我正在做这个可怕的错误。
然后我认为这是一个使用的情况:
var imgs = svg.selectAll("img").data([dataset]);
但是我对这个方法的担心是这个轴不能正确地绑定,就像正确的刻度值一样, 这就像他们只是坐在我的轴旁边的图像集合,我对我的坐标轴进行调整/定位所做的更改,我必须单独应用于我的图像集合。 它看起来不像在我的轴上具有适当的图像 – 刻度值那么优雅。
我做了什么可怕的错误? 有没有人需要我提供更多的信息?
再次感谢gals&guys!
更新 :感谢@larskotthoff,我已经添加了这个:
svg.select(".axis").selectAll("text").remove(); var ticks = svg.select(".axis").selectAll(".tick") .data(dataset) .append("svg:image") .attr("xlink:href", function (d) { return d.img ; }) .attr("width", 100) .attr("height", 100);
它(几乎)的作品! 那么它会显示图像,但正如你所猜测的那样,每个图像(即,它们的左上angular)的原点是每个刻度结束的地方,导致图像现在在图内呈现,而不是在图像外面勾号:
不能插入图像没有足够的StackOverflow代表,所以这里的url:i.stack.imgur.com/s2CX0.png 勾选图像出现在图中,而不是旁边勾号
很明显,我需要操纵图像的x和y,但是我怎样才能做到这一点呢? 换句话说,我怎样在D3中说:“ 把剔的x,y和减去(硬编码值)为150,并为我的图像做我的新的x,y。
再次感谢你的帮助!
更新#2 :终于发现this.parentNode并深入挖掘后,我只是新手发现,在目前绑定到我的轴的图像上设置的x,y属性是相对于每个相应的滴答! 我的意思是,我可以简单地加上:
.attr("x", -120) .attr("y", -50);
作为我的图像的附加属性,并将它们放在它们各自的刻度的左侧(返回到轴标签位置,而不是坐在图的顶部)。
数据集:
var dataset = [ { "bank": "Bank 1", "img": "Picture1.png" }, { "bank": "Bank 2", "img": "Picture2.png" }, { "bank": "Bank 3", "img": "Picture3.png" } ];
D3 JS代码:
var w = 1000; var h = 700; var padding = 30; var wpadding = 120; var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h+padding); svg.select(".axis").selectAll("text").remove(); var ticks = svg.select(".axis").selectAll(".tick") .data(dataset) .append("svg:image") .attr("xlink:href", function (d) { return d.img ; }) .attr("width", 100) .attr("height", 100); .attr("x", -120); .attr("y", -50); var yScale = d3.scale.ordinal() .domain(dataset.map(function (d) { return d.bank; })) .rangeRoundBands([0, h], 0.55); var yAxis = d3.svg.axis() .scale(yScale) .orient("left"); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + wpadding + ", 0)") .call(yAxis);