Как построить масштабируемую карту хороплетов со вставками для обработки дискретных данных в d3.v5? - PullRequest
0 голосов
/ 09 марта 2020

Очень новичок в D3 и из R, но намеревается разработать некоторые интерактивные карты хороплетов.

Я хочу разработать этот масштабируемый хороплет: https://bl.ocks.org/cmgiven/d39ec773c4f063a463137748097ff52f

в нечто подобное этому V5-хороплету с легко прикрепляемыми данными: https://bl.ocks.org/denisemauldin/3436a3ae06f73a492228059a515821fe

Я могу довольно легко перенести V5-хороплет, все еще выясняя, как настроить непрерывную шкалу на дискретную шкалу, но я на самом деле не знаю, как построить масштабируемый SVG в V5.

1 Ответ

0 голосов
/ 09 марта 2020

Я думаю, что в вашем вопросе вы спрашиваете о непрерывном масштабировании, здесь приведен фрагмент кода для непрерывного масштабирования для масштабируемого хороплета все в <g> групповом теге и примените увеличение к этому <g> тегу:

const zoom = d3.zoom()
  .scaleExtent([1, 8])
  .on('zoom', zoomed);

svg.call(zoom);

function zoomed() {
  zoomG.selectAll('path') // To prevent stroke width from scaling
    .attr('transform', d3.event.transform);
}

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height");

var unemployment = d3.map();
var stateNames = d3.map();

var path = d3.geoPath();

var x = d3.scaleLinear()
    .domain([1, 10])
    .rangeRound([600, 860]);

var color = d3.scaleThreshold()
    .domain(d3.range(0, 10))
    .range(d3.schemeBlues[9]);

var g = svg.append("g")
    .attr("class", "key")
    .attr("transform", "translate(0,40)");

g.selectAll("rect")
  .data(color.range().map(function(d) {
      d = color.invertExtent(d);
      if (d[0] == null) d[0] = x.domain()[0];
      if (d[1] == null) d[1] = x.domain()[1];
      return d;
    }))
  .enter().append("rect")
    .attr("height", 8)
    .attr("x", function(d) { return x(d[0]); })
    .attr("width", function(d) { return x(d[1]) - x(d[0]); })
    .attr("fill", function(d) { return color(d[0]); });

g.append("text")
    .attr("class", "caption")
    .attr("x", x.range()[0])
    .attr("y", -6)
    .attr("fill", "#000")
    .attr("text-anchor", "start")
    .attr("font-weight", "bold")
    .text("Unemployment rate");

g.call(d3.axisBottom(x)
    .tickSize(13)
    .tickFormat(function(x, i) { return i ? x : x + "%"; })
    .tickValues(color.domain()))
  .select(".domain")
    .remove();

var promises = [
  d3.json("https://d3js.org/us-10m.v1.json"),
  d3.tsv("https://gist.githubusercontent.com/denisemauldin/3436a3ae06f73a492228059a515821fe/raw/954210175a18c646eb751d59e04d5a4814fe3b03/us-state-names.tsv", function(d) {
    stateNames.set(d.id, d.name)
  }),
  d3.tsv("https://gist.githubusercontent.com/denisemauldin/3436a3ae06f73a492228059a515821fe/raw/954210175a18c646eb751d59e04d5a4814fe3b03/map.tsv", function(d) { 
    unemployment.set(d.name, +d.value); 
  })
]

Promise.all(promises).then(ready)

function ready([us]) {



  let zoomG = svg.append("g");

    zoomG.append("g")
      .attr("class", "counties")
    .selectAll("path")
    .data(topojson.feature(us, us.objects.states).features)
    .enter().append("path")
      .attr("fill", function(d) { 
          var sn = stateNames.get(d.id)
          d.rate = unemployment.get(stateNames.get(d.id)) || 0
          var col =  color(d.rate); 
          if (col) {
            return col
          } else {
            return '#ffffff'
          }
      })
      .attr("d", path)
    .append("title")
      .text(function(d) { 
    			return d.rate + "%"; });

    zoomG.append("path")
      .datum(topojson.mesh(us, us.objects.states, function(a, b) { return a !== b; }))
      .attr("class", "states")
      .attr("d", path);

    const zoom = d3.zoom()
      .scaleExtent([1, 8])
      .on('zoom', zoomed);

    svg.call(zoom);

    function zoomed() {
      zoomG.selectAll('path') // To prevent stroke width from scaling
        .attr('transform', d3.event.transform);
    }
}
.counties {
  fill: none;
}

.states {
  fill: none;
  stroke: #fff;
  stroke-linejoin: round;
}
<!DOCTYPE html>
<meta charset="utf-8">
<svg width="960" height="600"></svg>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
<script src="https://d3js.org/topojson.v2.min.js"></script>
...