如何在 d3.js (albersUsa) 中为每个州添加标签?
How to add Label to each state in d3.js (albersUsa)?
us.json
已加载,但当我尝试添加标签名称时,我无法使其工作。我在 .json
文件中没有看到名称 属性 那么我该如何添加每个州的名称?我对这个框架真的很陌生。
我在 Google 和 Whosebug 上尝试了不同的教程,但其中 none 对我有用。这是我试过的 link 情侣教程,我认为它是值得的。
- Add names of the states to a map in d3.js
- State/County names in TopoJSON or go back GeoJSON?
我的顾虑:
- 我想我在 us.json 文件中缺少名称 属性。 (如果这是问题所在,是否还有其他包含州名的 .json 文件?以及如何在该文件中使用州名?)
- 美国州名是否包含在
http://d3js.org/topojson.v1.min.js
中?
.html
文件(已加载框架)
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="http://d3js.org/topojson.v1.min.js"></script>
.js
文件:
var width = 1500,
height = 1100,
centered;
var usData = ["json/us.json"];
var usDataText = ["json/us-states.json"];
var projection = d3.geo.albersUsa()
.scale(2000)
.translate([760, height / 2]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("body").append("svg")
.style("width", "100%")
.style("height", "100%");
svg.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.on("click", clicked);
var g = svg.append("g");
d3.json(usData, function(unitedState) {
g.append("g")
.attr("class", "states-bundle")
.selectAll("path")
.data(topojson.feature(unitedState, unitedState.objects.states).features)
.enter()
.append("path")
.attr("d", path)
.attr("class", "states")
.on("click", clicked);
});
提前谢谢大家。如果你告诉我你在哪里学的,我也很感激d3.js。
正如您所说,您的 us.json
中没有州名。不过,它拥有的是唯一 ID,幸运的是,Bostock 先生已将这些 ID 映射到名称 here。
那么,让我们稍微修正一下这段代码。
首先,发出 json
请求以提取数据:
// path data
d3.json("us.json", function(unitedState) {
var data = topojson.feature(unitedState, unitedState.objects.states).features;
// our names
d3.tsv("us-state-names.tsv", function(tsv){
// extract just the names and Ids
var names = {};
tsv.forEach(function(d,i){
names[d.id] = d.name;
});
现在添加我们的可视化:
// build paths
g.append("g")
.attr("class", "states-bundle")
.selectAll("path")
.data(data)
.enter()
.append("path")
.attr("d", path)
.attr("stroke", "white")
.attr("class", "states");
// add state names
g.append("g")
.attr("class", "states-names")
.selectAll("text")
.data(data)
.enter()
.append("svg:text")
.text(function(d){
return names[d.id];
})
.attr("x", function(d){
return path.centroid(d)[0];
})
.attr("y", function(d){
return path.centroid(d)[1];
})
.attr("text-anchor","middle")
.attr('fill', 'white');
....
这是一个有效的 example。
us.json
已加载,但当我尝试添加标签名称时,我无法使其工作。我在 .json
文件中没有看到名称 属性 那么我该如何添加每个州的名称?我对这个框架真的很陌生。
我在 Google 和 Whosebug 上尝试了不同的教程,但其中 none 对我有用。这是我试过的 link 情侣教程,我认为它是值得的。
- Add names of the states to a map in d3.js
- State/County names in TopoJSON or go back GeoJSON?
我的顾虑:
- 我想我在 us.json 文件中缺少名称 属性。 (如果这是问题所在,是否还有其他包含州名的 .json 文件?以及如何在该文件中使用州名?)
- 美国州名是否包含在
http://d3js.org/topojson.v1.min.js
中?
.html
文件(已加载框架)
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="http://d3js.org/topojson.v1.min.js"></script>
.js
文件:
var width = 1500,
height = 1100,
centered;
var usData = ["json/us.json"];
var usDataText = ["json/us-states.json"];
var projection = d3.geo.albersUsa()
.scale(2000)
.translate([760, height / 2]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("body").append("svg")
.style("width", "100%")
.style("height", "100%");
svg.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.on("click", clicked);
var g = svg.append("g");
d3.json(usData, function(unitedState) {
g.append("g")
.attr("class", "states-bundle")
.selectAll("path")
.data(topojson.feature(unitedState, unitedState.objects.states).features)
.enter()
.append("path")
.attr("d", path)
.attr("class", "states")
.on("click", clicked);
});
提前谢谢大家。如果你告诉我你在哪里学的,我也很感激d3.js。
正如您所说,您的 us.json
中没有州名。不过,它拥有的是唯一 ID,幸运的是,Bostock 先生已将这些 ID 映射到名称 here。
那么,让我们稍微修正一下这段代码。
首先,发出 json
请求以提取数据:
// path data
d3.json("us.json", function(unitedState) {
var data = topojson.feature(unitedState, unitedState.objects.states).features;
// our names
d3.tsv("us-state-names.tsv", function(tsv){
// extract just the names and Ids
var names = {};
tsv.forEach(function(d,i){
names[d.id] = d.name;
});
现在添加我们的可视化:
// build paths
g.append("g")
.attr("class", "states-bundle")
.selectAll("path")
.data(data)
.enter()
.append("path")
.attr("d", path)
.attr("stroke", "white")
.attr("class", "states");
// add state names
g.append("g")
.attr("class", "states-names")
.selectAll("text")
.data(data)
.enter()
.append("svg:text")
.text(function(d){
return names[d.id];
})
.attr("x", function(d){
return path.centroid(d)[0];
})
.attr("y", function(d){
return path.centroid(d)[1];
})
.attr("text-anchor","middle")
.attr('fill', 'white');
....
这是一个有效的 example。