【发布时间】:2014-11-14 17:07:19
【问题描述】:
我的工具提示中返回“未定义”的数据字符串有问题,而同一条数据确实会影响我的 svg 的颜色。
目标:我想显示一个叶绿素风格的地图,它显示每个国家的工具提示 a) 国家名称,从 .json 对象加载(工作正常) b) 一些对应于每个国家/地区的值,从 tsv 加载(目前部分工作)
文件结构: 主 .js 文件调用 1 个 topojson 文件(带有国家路径和名称)以及一个 .tsv 文件(带有每个国家的特定区域数据)
使用的资源: 1- MBostock 的叶绿素(见下文注释) 2-贾斯汀帕尔默的d3.tip
玩它
这里有一个Plunker供大家玩玩(由于我使用的world.json很重,可能需要一段时间才能加载)。
---------------
相关代码位:
queue()
.defer(d3.json, "world.json")
.defer(d3.tsv, "winemap.tsv", function setMaptoTotal(d) { rate.set(d.name, +d.total); })
.await(ready);
var tip = d3.tip()
.attr('class', 'd3-tip')
.html(function mylabel(d) { return d.properties.name + "<table><tr><td><span style='color: #fcf772'> Total area cultivated: " + d.total +" ha</span></td></tr><tr><td> <span style='color:#bf2a2a'> Global rank: "+ d.rank + " </span></td></tr></table>";})
.direction('sw')
.offset([0, 2]);
var svg = d3.selectAll('body')
.append('svg')
.attr('width',width)
.attr('height',height)
.call(zoom)
.call(tip);
// ACTION STARTS HERE //
function ready(error, world) {
svg.append("g")
.attr("class", "counties")
.selectAll("path")
.data(topojson.feature(world, world.objects.countries).features)
.enter().append("path")
.attr("class", function (d) { return quantize(rate.get(d.properties.name)); })
.attr("d", path)
.call(tip)
.on('mouseover', tip.show)
.on('mouseout', tip.hide)
;
尝试的选项:
1- 移动 .call(tip) after 或 inside ready 函数,该函数通过 queue() 触发数据加载。 >>> 这仍然会在我的工具提示中返回 undefined。
2- 使用queue.defer(mylabel(d))。 >>> 屏幕上什么也没有。
3- 考虑到 d3.tsv 的异步特性,我通过了this question。如果我理解得很好,您必须在 d3.tsv 内部和之后引用要调用的函数(设置或不设置全局变量)。因此,我计划在 d3.tsv 内部和之后引用 mylabel(d) 函数。但是我注意到function (d) { return quantize(rate.get(d.properties.name)); }) 没有写在我的d3.tsv 中,但它工作正常。
注意:抱歉,我无法在此阶段发布更多链接,例如到 MBostick 的 chloropleth 或 d3.tip,但它需要更多的声誉 :)
【问题讨论】:
-
您似乎没有使用包含您要使用的信息的 CSV 数据。它不会自动合并,您需要根据相应国家/地区的名称自行查找其中的信息。
标签: asynchronous d3.js tooltip undefined