javascript - D3.js:使用图像(在数据中指定文件名)作为轴上的刻度值

标签 javascript json image d3.js

我目前有这些数据:

var dataset = [
{
 "bank": "Bank 1",
 "img": "Picture1.png"
},
{
 "bank": "Bank 2",
 "img": "Picture2.png"
},                  
{
 "bank": "Bank 3",
 "img": "Picture3.png"
}
];

复杂的现实世界数据,对吧?当然。好的,我目前使用此 D3.js 代码将“bank”作为轴上的刻度值:

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 值,而不仅仅是 bank 值。

一开始我以为是使用axis.tickValues([values])和匿名函数来引用img我的 JSON 数据中的值,但它不起作用。或者我做错了。

然后我以为是使用的情况:

 var imgs = svg.selectAll("img").data([dataset]);

但是我对这种方法的担心是它不会像正确的刻度值一样正确绑定(bind)到轴上;就好像它们只是恰好位于我的轴旁边的图像集合,并且我对轴所做的大小/定位更改也必须单独应用于我的图像集合。它看起来不像在我的轴上拥有正确的图像作为刻度值那么优雅。

我做错了什么可怕的事情吗?有人需要我提供更多信息吗?

再次感谢姐妹们!

更新:感谢@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);

而且它(几乎)有效!好吧,它显示了图像,但正如您可以猜到的那样,每个图像的原点(即它们的左上角)是每个刻度结束的位置,导致图像现在呈现在图表内部,而不是旁边的图表之外滴答声:

没有足够的 StackOverflow 代表就无法插入图像,所以这里是 URL:i.stack.imgur.com/s2CX0.png 刻度图像出现在图表内而不是在刻度旁边

显然我需要操纵图像的 x 和 y,但是相对于单个刻度的位置,我该如何做呢?换句话说,我在 D3 中怎么说:“取刻度的 x,y 并减去(硬编码的值)150,并将其作为我的图像的新 x,y。”?

再次感谢您的帮助!

更新 #2:在最终发现 this.parentNode 并深入研究之后,我只是新手发现当前图像上设置的 x,y 属性绑定(bind)到我的轴是相对于每个相应的刻度!我的意思是,我可以简单地添加:

                    .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);  

关于javascript - D3.js:使用图像(在数据中指定文件名)作为轴上的刻度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763498/

相关文章:

javascript - jQuery 在加载时保持所选内容

JavaScript - 刚刚学习

c++ - 如何使用 nlohmann/json.hpp 序列化 2 组

ruby-on-rails - rails 3 : What is the proper way to respond to REST-ful actions with JSON in rails?

Html 照片库 - 删除空间

python - 使用多个图像文件并行填充 numpy 3d 数组

javascript - 单击脚本上的 JQuery 触发更改检测-Angular 6

javascript - 如何包装管道流以使其看起来像单个流?

java - JSON:项目顺序

Android 我想从在线数据库流式传输图像