D3.js:如何组合两个数据集来创建地图并在鼠标悬停时显示值?
我想在 D3.js 中的地图上合并两个数据集。
例如:
第一个数据集:.json 中的空间数据。
第二个数据集:.csv 中的区域数据
-> 当您将鼠标悬停在地图上时,工具提示应显示包含第二个数据集中一些数据的句子。
我能够制作地图并显示带有 .json 文件中数据的工具提示,但如何插入第二个数据集?
- 我的函数中是否有一个用于创建地图的新功能?
- 我必须采用一种全新的方式吗?
- 在使用 d3.js 之前,我是否应该将 .json 文件与我的第二个数据集合并?
我很感激任何想法!:)
所以,我认为您要问的是如何从 json 中获取空间数据并将其与单独加载的一些 csv 数据连接起来?
我对正在绘制的分级统计图做了类似的事情,基本上我只是创建了一个拓扑元素 id 到数据对象的映射,然后我使用拓扑元素 id 进行了查找以获取我想要与实际绘制的地图元素关联的任何内容(我使用此方法根据 fips 国家代码设置分级统计图的颜色)。
所以基本上,绘制地图,以便您拥有与您想要能够悬停的每个地图元素相关联的 id。然后,在您的 mouseover/mouseout 处理程序中,您将使用该 id 查找要在工具提示中显示的数据,并使用 svg 标题元素或 tipsy 或手动绘制 svg 文本元素或其他任何元素来显示工具提示。
以下是绘制工具提示的一些有用参考: https://gist.github.com/biovisualize/1016860 http://jsfiddle.net/reblace/6FkBd/2/
来自 fiddle:
function mouseover(d) {
d3.select(this).append("text")
.attr("class", "hover")
.attr('transform', function(d){
return 'translate(5, -10)';
})
.text(d.name + ": " + d.id);
}
// Toggle children on click.
function mouseout(d) {
d3.select(this).select("text.hover").remove();
}
基本上,它是附加一个 SVG 文本元素并将其从悬停元素的位置。
下面是我在外部地图中查找数据的示例:
// Update the bound data
data.svg.selectAll("g.map path").transition().duration(750)
.style("fill", function(d) {
// Get the feature data from the mapData using the feature code
var val = mapData[d.properties.code];
// Return the colorScale value for the state's value
return (val !== undefined)? data.settings.colorScale(val) : undefined;
});
如果您的数据是静态的,则可以将其加入到 topojson 文件中(如果您正在使用该文件)。 https://github.com/mbostock/topojson/wiki/Command-Line-Reference
客户端可以更改我的数据,因此我将其分开保存,并在每次数据更改时重新绘制地图,以便颜色更新。由于我的数据是 topojson,我可以使用 d.properties.code 从地图数据中访问特征 id(因为我已经使用上面引用的 topojson 工具将代码加入到 topojson 文件中……但您可以使用您拥有的空间数据文件中的任何唯一 id)。