#javascript #d3.js #choropleth
#javascript #d3.js #choropleth
Вопрос:
Это мой первый вопрос здесь, поэтому, пожалуйста, потерпите.
Я пытаюсь создать choropleth (карту, на которой разные разделы окрашены в зависимости от некоторого присвоенного им значения), используя d3.js . Я использую пример, приведенный в https://www.d3-graph-gallery.com/graph/choropleth_basic.html , но изменив карту на карту Шотландии и изменив значения на плотность населения.
Когда я запускаю его, я получаю карту, но все они окрашены в один и тот же оттенок синего. Я пытался изменить домен colorScale, но безрезультатно.
Это то, что у меня есть на данный момент:
// The svg
var svg = d3.select("svg"),
width = svg.attr("width"),
height = svg.attr("height");
// Map and projection
var path = d3.geoPath();
var projection = d3.geoNaturalEarth()
.scale(20 * width / Math.PI)
.translate([width / 2 150, height / 2 2500]);
// Data and color scale
var data = d3.map();
var colorScale = d3.scaleThreshold()
.domain([0, 600])
.range(d3.schemeBlues[7]);
// Load external data and boot
d3.queue()
.defer(d3.json, "https://raw.githubusercontent.com/squirrel-star/scotland/main/geojsonscotlandladjson.geojson")
.defer(d3.csv, "https://raw.githubusercontent.com/squirrel-star/scotland/main/scotlanddensitywithid.csv", function(d) {
data.set(d.code, d.density);
})
.await(ready);
function ready(error, topo) {
console.log(data);
// Draw the map
svg.append("g")
.selectAll("path")
.data(topo.features)
.enter()
.append("path")
// draw each country
.attr("d", d3.geoPath()
.projection(projection)
)
// set the color of each country
.attr("fill", function(d) {
d.total = data.get(d.id) || 0;
return colorScale(d.total);
});
}
<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
<script src="https://d3js.org/d3-geo-projection.v2.min.js"></script>
<svg id="my_dataviz" width="400" height="400"></svg>
Любые предложения по его исправлению будут с благодарностью приняты. Спасибо!
Ответ №1:
Я думаю, вы, возможно, неправильно прочитали документацию d3.scaleThreshold
, потому что в ней говорится, что вам нужно иметь N
значения в вашем домене, если у вас есть N 1
значения в вашем диапазоне. В вашем случае это делает N = 6
.
Кроме того, d.id
не существует. Я использовал d.properties.LAD13NM
вместо этого, потому что это поле содержало название соответствующего округа.
Наконец, не было необходимости использовать a map
, поскольку вы использовали его только как какой-то объект, поэтому я просто заменил его обычным объектом.
// The svg
var svg = d3.select("svg"),
width = svg.attr("width"),
height = svg.attr("height");
// Map and projection
var path = d3.geoPath();
var projection = d3.geoNaturalEarth()
.scale(20 * width / Math.PI)
.translate([width / 2 150, height / 2 2500]);
// Data and color scale
var data = {};
var colorScale = d3.scaleThreshold()
.domain([100, 200, 300, 400, 500, 600])
.range(d3.schemeBlues[7]);
// Load external data and boot
d3.queue()
.defer(d3.json, "https://raw.githubusercontent.com/squirrel-star/scotland/main/geojsonscotlandladjson.geojson")
.defer(d3.csv, "https://raw.githubusercontent.com/squirrel-star/scotland/main/scotlanddensitywithid.csv", function(d) {
data[d.code] = d.density;
})
.await(ready);
function ready(error, topo) {
// Draw the map
svg.append("g")
.selectAll("path")
.data(topo.features)
.enter()
.append("path")
// draw each country
.attr("d", d3.geoPath()
.projection(projection)
)
// set the color of each country
.attr("fill", function(d) {
d.total = data[d.properties.LAD13NM] || 0;
return colorScale(d.total);
});
}
<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
<script src="https://d3js.org/d3-geo-projection.v2.min.js"></script>
<svg id="my_dataviz" width="400" height="400"></svg>