Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. (function() {
  2. var w = 800
  3. var h = 600
  4.  
  5. var w2 = 1000
  6. var h2 = 200
  7. var boundaries = {
  8. bottom: h2 - 60,
  9. top: 10,
  10. left: 60,
  11. right: w2 - 10
  12. }
  13.  
  14. //Define quantize scale to sort data values into buckets of color
  15. let color = ['#79A87A', '#E28413', '#00005E', '#DE3C4B', '#C42847', '#08519c']
  16.  
  17. // Convert date to YYYY/MM/DD
  18. var convertDate = date => {
  19. var D = date.split("/")
  20. return "" + D[2] + "/" + D[0] + "/" + D[1]
  21. }
  22.  
  23. //For converting Dates to strings
  24. var hourOfDay = time => {
  25. var values = time.split(":")
  26. return +values[0]
  27. }
  28.  
  29. var parseRow = row => ({
  30. "boro": row.BORO_NM,
  31. "date": convertDate(row.RPT_DT),
  32. "hour": +row.CMPLNT_FR_TM,
  33. "lat": parseFloat(row.Latitude),
  34. "lon": parseFloat(row.Longitude)
  35. })
  36.  
  37. //Define map projection
  38. // From http://bl.ocks.org/phil-pedruco/6646844
  39. var projection = d3.geoMercator()
  40. .center([-73.94, 40.70])
  41. .translate([w / 2, h / 2])
  42. .scale(55 * 1000)
  43.  
  44. var circleSize = 4
  45.  
  46. //Define path generator
  47. var path = d3.geoPath()
  48. .projection(projection)
  49.  
  50. //Create SVG element
  51. var svgGeo = d3.select("body").select("#chart1")
  52. .append("svg")
  53. .attr("width", w)
  54. .attr("height", h)
  55.  
  56. var svgLine = d3.select("body").select("#chart2")
  57. .append("svg")
  58. .attr("width", w2)
  59. .attr("height", h2)
  60.  
  61. //Load in GeoJSON data
  62. d3.json("data/boroughs.geojson", (error, json) => {
  63. if (error) console.log("error fetching data")
  64.  
  65. //Bind data and create one path per GeoJSON feature
  66. svgGeo.selectAll("path")
  67. .data(json.features)
  68. .enter()
  69. .append("path")
  70. .attr("d", path)
  71. .style("fill", (d, i) => color[i])
  72. .style("stroke", "gray")
  73.  
  74. d3.csv("data/all_murder.csv", parseRow, parsedData => {
  75. var data = parsedData.filter(d => d.boro && d.date && d.hour && d.lat && d.lon)
  76. var nestedData = d3.nest()
  77. .key(d => d.date)
  78. .sortKeys(d3.ascending)
  79. .entries(data)
  80.  
  81. var dates = nestedData.map(d => new Date(d.key))
  82.  
  83. var xMin = d3.min(dates)
  84. var xMax = d3.max(dates)
  85.  
  86. x = d3.scaleTime()
  87. .domain([xMin, xMax])
  88. .range([boundaries.left, boundaries.right])
  89.  
  90. xAxis = d3.axisBottom(x)
  91.  
  92. y = d3.scaleLinear()
  93. .domain([1, d3.max(nestedData, d => d.values.length)])
  94. .range([boundaries.bottom, boundaries.top])
  95.  
  96. yAxis = d3.axisLeft(y)
  97.  
  98. svgLine.append("g")
  99. .attr("transform", "translate(0, " + boundaries.bottom + ")")
  100. .call(xAxis)
  101.  
  102. svgLine.append("g")
  103. .attr("id", "yAxis")
  104. .attr("transform", "translate(" + boundaries.left + ", 0)")
  105. .call(yAxis)
  106.  
  107. // Text label for the y axis
  108. svgLine.append("text")
  109. .attr("transform", "rotate(-90)")
  110. .style("text-anchor", "middle")
  111. .attr("y", boundaries.left / 2 - 10)
  112. .attr("x", -h2 / 2)
  113. .text("# Murders Committed")
  114.  
  115.  
  116. // Text label for the y axis
  117. svgLine.append("text")
  118. .style("text-anchor", "middle")
  119. .attr("y", boundaries.bottom + 40)
  120. .attr("x", w2 / 2)
  121. .text("Date")
  122.  
  123.  
  124. svgLine.append("path")
  125. .datum(nestedData)
  126. // .attr("class", selector + " path")
  127. .attr("stroke-width", "1px")
  128. .attr("fill", "none")
  129. .attr("stroke", "steelblue")
  130. .attr("d", d3.line()
  131. .x(d => +x(new Date(d.key)))
  132. .y(d => y(d.values.length))
  133. )
  134.  
  135. // DRAW POINTS ON MAP
  136. var mapDots = svgGeo.append("g").selectAll("circle")
  137. .data(data)
  138. .enter()
  139. .append("circle")
  140. .attr("r", circleSize)
  141. .style("stroke-width", 0.25)
  142. .style("opacity", 0.75)
  143. .attr("fill", "purple")
  144. .attr("cx", d => projection([d.lon, d.lat])[0])
  145. .attr("cy", d => projection([d.lon, d.lat])[1])
  146.  
  147.  
  148. function brushEnd() {
  149. var coords = d3.brushSelection(this)
  150. if (coords) {
  151. var mapx0 = x.invert(coords[0])
  152. var mapx1 = x.invert(coords[1])
  153.  
  154. // Decide which datapoints to display
  155. mapDots.style("fill", d => {
  156. if (mapx0 <= new Date(d.date) && new Date(d.date) <= mapx1) {
  157. return "purple"
  158. }
  159. else {
  160. return "transparent"
  161. }
  162. })
  163. }
  164. }
  165.  
  166. var brush = d3.brushX()
  167. .extent([
  168. [boundaries.left, boundaries.top],
  169. [boundaries.right, boundaries.bottom]
  170. ])
  171. .on("brush", brushEnd)
  172.  
  173. svgLine.append("g")
  174. .call(brush)
  175. .call(brush.move, // Creates initial Window
  176. [boundaries.left, boundaries.left + 100]
  177. )
  178. })
  179.  
  180.  
  181. })
  182. })()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement