#javascript #svg #d3.js
Вопрос:
Я хочу раскрасить разные части карты разными цветами в зависимости от существующего значения. Карта разделена на округа, и у меня есть значения для каждого округа, которые я хочу перевести в цвет. Это мой код для попытки раскрасить карту.
Диапазон, который я установил, находится между [ 40, 19054 ]
. Он хорошо работает, окрашивая всю карту в один цвет, поэтому, например, установка цвета(19000) сделает всю карту красной.
let topo = json.features let datas = aggCounties d3.json("/counties.json").then(function(json) { function getCountPerKOMKODE() { for (let i = 0; i lt; topo.length; i ) { for (let j = 0; j lt; datas.length; j ) { let jsonKOMKODE = json.features[i].properties.KOMKODE; let csvKOMKODE = datas[j].kommune_kode let csvCOUNT = datas[j].count if (csvKOMKODE == jsonKOMKODE) { return csvCOUNT } } } } } let color = d3.scaleQuantize() .domain(d3.extent(getRangeDomain())) .range(["white", "pink", "red"]) let g = svg.append("g"); g.selectAll("path").append("g") .data(topo) .enter() .append('path') .attr('class', 'county') .attr("d", path) .style('fill', color(getCountPerKOMKODE())) });
Мне кажется, что я неправильно понимаю процесс того, как окрашена карта? Из того, что я читал, он должен ориентироваться на отдельные пути и применять заданный цвет/значение?
Спасибо
РЕДАКТИРОВАТЬ — проблема решена, благодаря @AndrewReid, см. Обновления кода ниже:
function getCountPerKOMKODE(path) { for (let j = 0; j lt; datas.length; j ) { // var jsonKOMKODE = json.features[j].properties.KOMKODE; let csvKOMKODE = datas[j].kommune_kode let csvCOUNT = datas[j].count if (csvKOMKODE == path) { return csvCOUNT } } } g.selectAll("path").append("g") .data(topo) .enter().append('path').attr('class', 'county') .attr("d", path).style('fill', function(d,i) { let komkode = d.properties.KOMKODE return color(getCountPerKOMKODE(komkode)) })
И вуаля, карта теперь раскрашена.
Комментарии:
1. Можете ли вы поделиться этой функцией
getCountPerCounty()
? Если вы изменили имя для удобства чтения в вопросе , и этоgetCountPerKOMKODE
функция, которая не принимает параметров, как будет извлекаться другое значение при каждом ее вызове и как это возвращаемое значение будет соотноситься с путем, который вы раскрашиваете?2. @AndrewReid извини, это опечатка! Исправил это сейчас. Он не принимает параметров, потому что проверяет, что коды округов равны из json и csv-файла, а затем возвращает соответствующее значение из числа столбцов csv-файла, в котором сопоставлен этот код округа. Я надеюсь, что в этом есть смысл. Поэтому, если код округа из json равен 600, он находит то же значение в csv и возвращает соответствующее количество.
3. @AndrewReid О, вы имеете в виду, что он должен иметь параметр со значением пути, а затем проверить значение этого пути в функции? Да, я вижу, что это недостаток..
4. В настоящее время вы создаете путь для каждого элемента(/функции) в
topo
. Вы можете получить доступ к этим связанным данным (функции) с.style('fill', function(d,i) { /* logic */ return color(value) })
помощью » гдеd
находится эта функция (иi
ее индекс)». Это должно помочь вам избежать необходимости использовать циклtopo
«для». В качестве альтернативы вы можете задать свойство каждого объекта в цикле for, а затем получить к нему доступ при передаче значения цвету.5. О, ты только что заставил так много вещей щелкать для меня, ха-ха, большое спасибо, теперь это работает. Мне просто нужно добавить лучшую цветовую схему, чтобы подстроиться под диапазон значений, но наконец-то есть цвета ура!