Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1.  
  2. var margin = { top: 200, right: 50, bottom: 50, left: 50 },
  3. width = window.innerWidth - margin.left - margin.right,
  4. height = 1000 - margin.top - margin.bottom;
  5.  
  6. var svg = d3.select("body").append("svg")
  7. .attr("width", width + margin.left + margin.right)
  8. .attr("height", height + margin.top + margin.bottom)
  9. .append("g")
  10. .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
  11.  
  12. var projection = d3.geoAlbersUsa()
  13. .scale([width]);
  14. var path = d3.geoPath(projection);
  15. var counts = d3.map();
  16. var regionMap = d3.map();
  17. var years
  18. var currentYear
  19.  
  20. var colors = d3.schemeBlues[9];
  21. var colorScale = d3.scaleQuantize()
  22. .range(colors)
  23. .domain([1, 2]);
  24. var logScale = d3.scaleLog()
  25. .range([1, 2]);
  26. var scale = d => colorScale(logScale(d3.max([d, 1])));
  27.  
  28. function strong(text) {
  29. return "<strong>" + text + "</strong>"
  30. }
  31.  
  32. var tip = d3.tip()
  33. .attr("class", "tip")
  34. .offset([-10, 0])
  35. .html(function (d) {
  36. var state = d.properties.name;
  37. var region = regionMap.get(state);
  38. var count = counts.get(state);
  39.  
  40. return "State: " + strong(state) +
  41. "<br>Region: " + strong(region) +
  42. "<br>Year: " + strong(currentYear) +
  43. "<br>Earthquakes: " + strong(count) + "</span>";
  44. });
  45.  
  46. svg.call(tip)
  47.  
  48. function handleMouseOver(d) {
  49. d3.select(this)
  50. .attr("stroke-width", "3")
  51.  
  52. tip.show(d);
  53. }
  54.  
  55. function handleMouseOut(d) {
  56. d3.select(this)
  57. .attr("stroke-width", "1")
  58.  
  59. tip.hide(d);
  60. }
  61.  
  62. // Slider
  63. var dataTime = d3.range(0, 6).map(function (d) {
  64. return new Date(2010 + d, 6, 6);
  65. });
  66.  
  67. var sliderTime = d3
  68. .sliderBottom()
  69. .min(d3.min(dataTime))
  70. .max(d3.max(dataTime))
  71. .step(1000 * 60 * 60 * 24 * 365)
  72. .width(300)
  73. .tickFormat(d3.timeFormat('%Y'))
  74. .tickValues(dataTime)
  75. .default(new Date(2010, 6, 1))
  76. .on('onchange', val => {
  77. var newYear = d3.timeFormat('%Y')(val)
  78. if (newYear === currentYear) { return }
  79.  
  80. d3.select('p#value-time').text(newYear);
  81. var datechange = new CustomEvent("datechange", { detail: { year: newYear }})
  82. d3.select('p#value-time').node().dispatchEvent(datechange)
  83. });
  84.  
  85. var gTime = d3
  86. .select('div#slider-time')
  87. .append('svg')
  88. .attr('width', 500)
  89. .attr('height', 100)
  90. .append('g')
  91. .attr('transform', 'translate(30,30)');
  92.  
  93. gTime.call(sliderTime);
  94. d3.select('p#value-time').text(d3.timeFormat('%Y')(sliderTime.value()));
  95.  
  96.  
  97. // Legends section
  98. var legend = svg.append("g")
  99. .attr("class", "legend")
  100. .attr("transform", "translate(" + (width) + "," + 100 + ")");
  101.  
  102. legend.append("text")
  103. .attr("class", "legend-title")
  104. .attr("text-anchor", "end")
  105. .text("Earthquake Frequency");
  106.  
  107. var promises = [
  108. d3.json("states-10m.json"),
  109. d3.csv("state-earthquakes.csv", function (d) {
  110. //counts.set(d.States, +d["Total Earthquakes"]); // connect to slider??!!
  111. years = years || Object.keys(d)
  112. .filter(c => c.match(/^\d+$/))
  113. .sort()
  114.  
  115. currentYear = years[0]
  116. counts.set(d.States, +d[currentYear]);
  117. regionMap.set(d.States, d.Region);
  118. return d
  119. })
  120. ];
  121.  
  122. function renderMap(topo, data) {
  123. logScale.domain([
  124. d3.max([d3.min(counts.values()), 1]),
  125. d3.max(counts.values())
  126. ]);
  127.  
  128. var mapNodes = svg.selectAll("path")
  129. .data(topojson.feature(topo, topo.objects.states).features)
  130.  
  131. mapNodes
  132. .enter()
  133. .append("path")
  134. // .attr("transform", "translate(" + (-200) + "," + height/2 + ")")
  135. .on("mouseover", handleMouseOver)
  136. .on("mouseout", handleMouseOut)
  137. .attr("stroke", "gray")
  138. .attr("d", path)
  139. .merge(mapNodes)
  140. .transition()
  141. .attr("fill", d => scale(counts.get(d.properties.name)))
  142.  
  143. /* svg.append("path")
  144. .datum(topojson.mesh(topo, topo.objects.states, function(a, b) { return a !== b; }))
  145. .attr("class", "states")
  146. .attr("d", path)
  147. .attr("stroke", "red"); */
  148.  
  149. svg.selectAll("path")
  150. .attr("transform", "translate(" + ((width - 950) / 2 - 100) + ", 0)");
  151.  
  152. var size = 20;
  153. function yLoc(d, i) {
  154. return 10 + i * (size + 5);
  155. }
  156.  
  157. var mapSquares = legend
  158. .selectAll(".square")
  159. .data(colors)
  160.  
  161. mapSquares
  162. .enter()
  163. .append("rect")
  164. .attr("class", "square")
  165. .attr("width", size)
  166. .attr("height", size)
  167. .attr("x", -110)
  168. .attr("y", yLoc)
  169. .merge(mapSquares)
  170. .attr("fill", d => d);
  171.  
  172. var mapFrequencies = legend
  173. .selectAll(".legend-text")
  174. .data(colors)
  175.  
  176. mapFrequencies
  177. .enter()
  178. .append("text")
  179. .attr("class", "legend-text")
  180. .attr("alignment-baseline", "middle")
  181. .attr("x", -80)
  182. .attr("y", yLoc)
  183. .attr("dy", size / 2)
  184. .merge(mapFrequencies)
  185. .text(d => Math.round(logScale.invert(colorScale.invertExtent(d)[0])));
  186. }
  187.  
  188.  
  189. Promise.all(promises).then(function ([topo, data]) {
  190. d3.select('p#value-time').node().addEventListener("datechange", function (event) {
  191. currentYear = event.detail.year
  192. data.forEach(s => counts.set(s.States, +s[currentYear]))
  193. renderMap(topo, data)
  194. })
  195.  
  196. renderMap(topo, data)
  197. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement