What


  • administrators

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <script src="https://d3js.org/d3.v4.min.js"></script>
        <script src="https://rawgit.com/susielu/d3-annotation/master/d3-annotation.min.js"></script>
        <script
          src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"
          integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww=="
          crossorigin="anonymous"
        ></script>
        <style type="text/css">
          /* On mouse hover, lighten state color */
          /* path:hover {
            fill-opacity: 0.7;
          } */
    
          div.markets {
            fill-opacity: 0.8;
          }
    
          /* Style for Custom Tooltip */
          div.tooltip {
            position: absolute;
            text-align: center;
            width: 60px;
            height: 28px;
            padding: 2px;
            font: 12px sans-serif;
            background: white;
            border: 0px;
            border-radius: 8px;
            pointer-events: none;
          }
    
          /* Legend Font Style */
          body {
            font: 11px sans-serif;
          }
    
          /* Legend Position Style */
          .legend {
            position: absolute;
            left: 800px;
            top: 350px;
          }
        </style>
      </head>
      <body>
        <button id="select-vq">VQ Markets</button>
        <button id="select-wtw">WTW Markets</button>
        <button id="select-aon">AON Markets</button>
        <button id="select-mercer">MERCER Markets</button>
        <button id="hide-markets">Hide Markets</button>
    
        <script type="text/javascript">
          /*  This visualization was made possible by modifying code provided by:
    
                Scott Murray, Choropleth example from "Interactive Data Visualization for the Web"
                https://github.com/alignedleft/d3-book/blob/master/chapter_12/05_choropleth.html
    
                Malcolm Maclean, tooltips example tutorial
                http://www.d3noob.org/2013/01/adding-tooltips-to-d3js-graph.html
    
                Mike Bostock, Pie Chart Legend
                http://bl.ocks.org/mbostock/3888852  */
    
          "use strict";
    
          //Width and height of map
          var width = 960;
          var height = 500; // D3 Projection
    
          var projection = d3
            .geoAlbersUsa()
            // .albersUsa()
            .translate([width / 2, height / 2]) // translate to center of screen
            .scale([1000]); // scale things down so see entire US
          // Define path generator
    
          var path = d3
            .geoPath() // path generator that will convert GeoJSON to SVG paths
            .projection(projection); // tell path generator to use albersUsa projection
          // Define linear scale for output
    
          var color = d3
            .scaleLinear()
            .range([
              "rgb(213,222,217)",
              "rgb(69,173,168)",
              "rgb(84,36,55)",
              "rgb(217,91,67)",
            ]);
          var legendText = [
            "Cities Lived",
            "States Lived",
            "States Visited",
            "Nada",
          ]; //Create SVG element and append map to the SVG
    
          var svg = d3
            .select("body")
            .append("svg")
            .attr("width", width)
            .attr("height", height); // Append Div for tooltip to SVG
    
          var div = d3
            .select("body")
            .append("div")
            .attr("class", "tooltip")
            .style("opacity", 0);
          var layer1 = svg.append("g");
          var layer2 = svg.append("g");
          var layer3 = svg.append("g"); // Load GeoJSON data and merge with states data
    
          var offsets = {
            VT: [0, 50],
            NH: [15, 35],
            MA: [20, 25],
            RI: [28, 20],
            CT: [35, 10],
            NJ: [34, 20],
            DE: [33, 30],
            MD: [47, 35],
            DC: [49, 21],
          };
    
          d3.json("us-states-abbr.json", function (statejson) {
            layer1
              .selectAll("path")
              .data(statejson.features)
              .enter()
              .append("path")
              .attr("d", path)
              .style("stroke", "#cc0000")
              .style("stroke-width", "1")
              .style("fill", "none");
    
            var smalllStates = statejson.features.filter((item) =>
              _.has(offsets, item.properties.abbr)
            );
    
            smalllStates.forEach((item) => {
              var x = path.centroid(item)[0];
              var y = path.centroid(item)[1];
    
              var abbr = item.properties.abbr;
    
              var offset = offsets[abbr];
    
              var annotations = [
                {
                  note: {
                    label: abbr,
                  },
                  x: x,
                  y: y,
                  dy: offset[0],
                  dx: offset[1],
                },
              ];
    
              // Add annotation to the chart
              const makeAnnotations = d3.annotation().annotations(annotations);
              svg.append("g").call(makeAnnotations);
            });
    
            var bigStates = statejson.features.filter(
              (item) => !_.has(offsets, item.properties.abbr)
            );
    
            svg
              .append("g")
              .attr("class", "states-names")
              .selectAll("text")
              .data(bigStates)
              .enter()
              .append("svg:text")
              .text(function (d) {
                return d.properties.abbr;
              })
              .attr("x", function (d) {
                console.log(path.centroid(d));
                return path.centroid(d)[0];
              })
              .attr("y", function (d) {
                return path.centroid(d)[1];
              })
              .attr("text-anchor", "middle")
              .attr("fill", "black");
          });
    
          // const annotations = [
          //   {
          //     note: {
          //       label: "Here is the annotation label",
          //       title: "Annotation title",
          //     },
          //     x: 562,
          //     y: 143,
          //     dy: 200,
          //     dx: 200,
          //   },
          // ];
    
          // // Add annotation to the chart
          // const makeAnnotations = d3.annotation().annotations(annotations);
          // svg.append("g").call(makeAnnotations);
    
          var items = ["#cc0000", "#00cc00", "#0000cc"];
          // d3.json("mercerMarkets.json", function (vqs) {
          //   vqs.forEach(function (vq) {
          //     var nlayer = svg.append("g").attr("class", "markets");
          //     // var color = items[Math.floor(Math.random() * items.length)];
          //     var color = vq.color;
          //     var file = vq.file;
          //     d3.json(file, function (json) {
          //       var features = [json];
          //       nlayer
          //         .selectAll("path")
          //         .data(features)
          //         .enter()
          //         .append("path")
          //         .attr("class", "markets")
          //         .attr("d", path)
          //         .style("stroke", "#ccc")
          //         .style("stroke-width", "1")
          //         .style("fill", color)
          //         .style("opacity", "0.8");
          //     });
          //   });
          // });
          document
            .getElementById("select-vq")
            .addEventListener("click", function () {
              svg.selectAll(".markets").remove();
              d3.json("vqMarkets.json", function (vqs) {
                vqs.forEach(function (vq) {
                  var nlayer = svg.append("g").attr("class", "markets");
                  var color = vq.color;
                  var file = vq.file;
                  d3.json(file, function (json) {
                    var features = [json];
                    nlayer
                      .selectAll("path")
                      .data(features)
                      .enter()
                      .append("path")
                      .attr("d", path)
                      .style("stroke", "#ccc")
                      .style("stroke-width", "1")
                      .style("fill", color);
                  });
                });
              });
            });
    
          document
            .getElementById("hide-markets")
            .addEventListener("click", function () {
              svg.selectAll(".markets").remove();
            });
          document
            .getElementById("select-wtw")
            .addEventListener("click", function () {
              svg.selectAll(".markets").remove();
              d3.json("wtwMarkets.json", function (vqs) {
                vqs.forEach(function (vq) {
                  var nlayer = svg.append("g").attr("class", "markets");
                  var color = vq.color;
                  var file = vq.file;
    
                  d3.json(file, function (json) {
                    var features = [json];
                    nlayer
                      .selectAll("path")
                      .data(features)
                      .enter()
                      .append("path")
                      .attr("d", path)
                      .style("stroke", "#ccc")
                      .style("stroke-width", "1")
                      .style("fill", color);
                  });
                });
              });
            });
    
          document
            .getElementById("select-aon")
            .addEventListener("click", function () {
              svg.selectAll(".markets").remove();
              d3.json("aonMarkets.json", function (vqs) {
                vqs.forEach(function (vq) {
                  var nlayer = svg.append("g").attr("class", "markets");
                  var color = vq.color;
                  var file = vq.file;
                  d3.json(file, function (json) {
                    var features = [json];
                    nlayer
                      .selectAll("path")
                      .data(features)
                      .enter()
                      .append("path")
                      .attr("d", path)
                      .style("stroke", "#ccc")
                      .style("stroke-width", "1")
                      .style("fill", color);
                  });
                });
              });
            });
    
          document
            .getElementById("select-mercer")
            .addEventListener("click", function () {
              svg.selectAll(".markets").remove();
              d3.json("mercerMarkets.json", function (vqs) {
                vqs.forEach(function (vq) {
                  var nlayer = svg.append("g").attr("class", "markets");
                  var color = vq.color;
                  var file = vq.file;
                  d3.json(file, function (json) {
                    var features = [json];
                    nlayer
                      .selectAll("path")
                      .data(features)
                      .enter()
                      .append("path")
                      .attr("d", path)
                      .style("stroke", "#ccc")
                      .style("stroke-width", "1")
                      .style("fill", color);
                  });
                });
              });
            });
        </script>
      </body>
    </html>