我有一张美国州的地图,由fips代码识别并用topoJSON映射。
我还有一系列fips代码和人口data = [{fips: 1, pop: 2000}, {fips:2, pop: 3240}, etc.]
我正在尝试使用以下代码按人口对州进行着色。关于它为什么不工作的任何想法?
g.append("g")
.attr("id", "states")
.selectAll("path")
.data(state_features)
.enter().append("path")
.attr("d", path)
.attr("class", "state")
.style("fill", function(d) {
state = data.filter(function( obj ) { return obj.fips == d.id; })[0];
return color(state.pop); })
.on("mouseover", tip.show)
svg.call(tip)
类似的想法适用于我的工具包:
var tip = d3.tip()
.html(functioN(d, i) {
state = data.filter(function( ob ) { return obj.fips == d.id;})[0]
return state.pop;})
答案 0 :(得分:1)
我相信你很亲密。如果您使用常规GeoJSON并将数据定义为data(state_features)
,则fips
键可能位于名为properties
的集合中。如果是这种情况,您只需在properties
之前添加fips
,如下所示:
.style("fill", function(d) {
var state = data.filter(function( obj ) { return obj.properties.fips == d.id; })[0];
return color(state.pop); })
这可以解释为什么states
为undefined
。
另外,在填充路径之前检查var data
中是否有所有状态是个好主意,否则它将再次返回undefined。你可以这样做:
if (typeof state != 'undefined'){
return color(state.pop);
} else {
return someColorHere;
}
答案 1 :(得分:0)
对于path
,您应该使用attr
函数和stroke
属性:
g.append("g")
.attr("id", "states")
.selectAll("path")
.data(state_features)
.enter().append("path")
.attr("d", path)
.attr("class", "state")
.attr('stroke', function(d) {
var state = data.filter(function( obj ) { return obj.fips == d.id; })[0];
return color(state.pop); })
.attr('stroke-width', 2)
.attr("fill", "none")
.on("mouseover", tip.show);