Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.05 KB | None | 0 0
  1. var barW = 500,
  2. barH = 300,
  3. barMargin = {top: 20, bottom: 120, left: 100, right: 20},
  4. barX = d3.scaleBand().padding(0.1),
  5. barY = d3.scaleLinear(),
  6. barXAxis = null,
  7. occCodes = "15-0000";
  8.  
  9. function extractJobsPct(jobData, year, occCode, number) {
  10. var res = jobData.filter(
  11. function(d) { return ((year == null || d.year == year) &&
  12. (occCode == null || d.occ_code == occCode)); });
  13. res = res.sort(function(a,b) {
  14. return d3.descending(+a.jobs_1000,+b.jobs_1000);
  15. });
  16. if (number) {
  17. return res.slice(0,number);
  18. } else {
  19. return res;
  20. }
  21. }
  22.  
  23. function createBars(divId, jobData, year, occCode) {
  24. var svg = d3.select(divId).append("svg")
  25. .attr("width", barW+barMargin.left+barMargin.right)
  26. .attr("height", barH+barMargin.top+barMargin.bottom)
  27. .append("g")
  28. .attr("class", "main")
  29. .attr("transform",
  30. "translate(" + barMargin.left + "," + barMargin.top + ")")
  31.  
  32. var csData = extractJobsPct(jobData, year, occCode, 18);
  33.  
  34. barX.range([0,barW])
  35. .domain(csData.map(function(d) { return d.area_title; }));
  36. barY.range([barH,0])
  37. .domain([0,d3.max(extractJobsPct(jobData, null, occCode),
  38. function(d) { return +d.jobs_1000; })]);
  39.  
  40.  
  41. svg.selectAll("rect")
  42. .data(csData)
  43. .enter().append("rect")
  44. .attr("class", "bar")
  45. .attr("x", function(d) { return barX(d.area_title); })
  46. .attr("y", function(d) { return barY(+d.jobs_1000); })
  47. .attr("width", barX.bandwidth())
  48. .attr("height", function(d) { return barH - barY(+d.jobs_1000); })
  49. .style("fill", "blue")
  50.  
  51. barXAxis = d3.axisBottom(barX);
  52.  
  53. svg.append("g")
  54. .attr("transform", "translate(0," + barH +")")
  55. .attr("class", "x axis")
  56. .call(barXAxis)
  57.  
  58. var barYAxis = d3.axisLeft(barY);
  59.  
  60. svg.append("g")
  61. .attr("class", "y axis")
  62. .call(barYAxis)
  63.  
  64. svg.append("g")
  65. .attr("transform", "translate(-30," + (barH/2) + ") rotate(-90)")
  66. .append("text")
  67. .style("text-anchor", "middle")
  68. .text("Jobs Per 1000")
  69.  
  70. svg.append("text")
  71. .attr("x", barW/2)
  72. .attr("y", barH + 115)
  73. .text("State")
  74. }
  75.  
  76. function updateBars(divId, jobData, year, occCode)
  77. {
  78. // write code to update the bar chart created to the specified year
  79. // you should use two transitions, one to update the bar values
  80. // and the other to reorder the bars
  81. // Make sure to transition the axes, too!
  82.  
  83. var svg = d3.select(divId).append("svg")
  84. .attr("width", barW+barMargin.left+barMargin.right)
  85. .attr("height", barH+barMargin.top+barMargin.bottom)
  86. .append("g")
  87. .attr("class", "main")
  88. .attr("transform",
  89. "translate(" + barMargin.left + "," + barMargin.top + ")")
  90.  
  91. var csData = extractJobsPct(jobData, year, occCode, 18);
  92.  
  93. barX.range([0,barW])
  94. .domain(csData.map(function(d) { return d.area_title; }));
  95. barY.range([barH,0])
  96. .domain([0,d3.max(extractJobsPct(jobData, null, occCode),
  97. function(d) { return +d.jobs_1000; })]);
  98.  
  99. console.log(csData);
  100.  
  101. svg.selectAll("rect.bar")
  102. .data(csData)
  103. .enter().append("rect")
  104. .transition()
  105. .duration(1000)
  106. .style("fill", "blue")
  107. .attr("class", "bars")
  108. .attr("x", function(d) { return barX(d.area_title); })
  109. .attr("y", function(d) { return barY(+d.jobs_1000); })
  110. .attr("width", barX.bandwidth())
  111. .attr("height", function(d) { return barH - barY(+d.jobs_1000); })
  112.  
  113. barXAxis = d3.axisBottom(barX);
  114.  
  115. svg.append("g")
  116. .attr("transform", "translate(0," + barH +")")
  117. .attr("class", "x axis")
  118. .call(barXAxis)
  119.  
  120. var barYAxis = d3.axisLeft(barY);
  121.  
  122. svg.append("g")
  123. .attr("class", "y axis")
  124. .call(barYAxis)
  125.  
  126. svg.append("g")
  127. .attr("transform", "translate(-30," + (barH/2) + ") rotate(-90)")
  128. .append("text")
  129. .style("text-anchor", "middle")
  130. .text("Jobs Per 1000")
  131.  
  132. svg.append("text")
  133. .attr("x", barW/2)
  134. .attr("y", barH + 115)
  135. .text("State")
  136.  
  137.  
  138. }
  139.  
  140.  
  141. function getStateRankings(jobData, occCode) {
  142. // TODO: compute the state rankings for the given occCode
  143.  
  144. var sortingData = jobData.sort(function (d, i){
  145. return d3.descending(+d["tot_emp"],+i["tot_emp"]);
  146. });
  147.  
  148. var StateRankings = d3.nest()
  149. .key (function (state) {return state.area_title})
  150. .rollup(function (d){
  151. return d.findIndex(function(state){
  152. return state.occ_code === occCode;
  153. });
  154. })
  155. .object(sortingData);
  156. return StateRankings;
  157. }
  158.  
  159. function createBrushedVis(divId, usMap, jobData, year) {
  160.  
  161.  
  162. var jobData = jobData.filter(
  163. function(d) { return (+d.year == year); });
  164.  
  165. var width = 600,
  166. height = 400;
  167.  
  168. var svg = d3.select(divId).append("svg")
  169. .attr("width", width)
  170. .attr("height", height);
  171.  
  172. var projection = d3.geoAlbersUsa()
  173. .fitExtent([[0,0],[width,height]], usMap);
  174.  
  175. var path = d3.geoPath()
  176. .projection(projection);
  177.  
  178. var rankings = getStateRankings(jobData, occCodes);
  179.  
  180. var color = d3.scaleSequential(d3.interpolateViridis).domain([22,0]);
  181.  
  182. var colored = function(d) { return color(rankings[d.properties.name]); }
  183.  
  184. svg.append("g")
  185. .selectAll("path")
  186. .data(usMap.features)
  187. .enter().append("path")
  188. .attr("d", path)
  189. .attr("fill", colored)
  190. .attr("class", "state-boundary")
  191. .classed("highlight", false)
  192.  
  193. var bWidth = 400,
  194. bHeight = 400,
  195. midX = 200;
  196.  
  197. var allJobs = d3.nest()
  198. .key(function(d) { return d["occ_code"]; })
  199. .key(function(d) { return d["occ_title"]; })
  200. .rollup(function(v) {
  201. return v.reduce(function(s,d) {
  202. if (!+d.tot_emp) { return s; } return s + +d.tot_emp; },0); })
  203. .entries(jobData)
  204. .sort(function(a,b) { return d3.descending(+a.values[0].value, +b.values[0].value); });
  205.  
  206. var barSvg = d3.select(divId).append("svg")
  207. .attr("width", bWidth)
  208. .attr("height", bHeight)
  209. .style("vertical-align", "bottom")
  210.  
  211. var y = d3.scaleBand().padding(0.1).range([0,bHeight]).domain(allJobs.map(function(d) { return d.values[0].key; }));
  212. var x = d3.scaleLinear().range([0,bWidth-midX]).domain([0,d3.max(allJobs, function(d) { return d.values[0].value; })]);
  213.  
  214. var bars = barSvg.selectAll(".bar").data(allJobs)
  215. .enter().append("g")
  216. .attr("transform",
  217. function(d) { return "translate(0," + y(d.values[0].key) + ")";})
  218. .attr("class", "bar")
  219.  
  220.  
  221. function jobMouseEnter(d) {
  222. d3.selectAll("rect").classed("highlight", false);
  223. d3.select(this).classed("highlight", true);
  224. occCodes = d3.select(this).datum().key;
  225. console.log(occCodes);
  226. rankings = getStateRankings(jobData, occCodes);
  227. colored = function(d) { return color(rankings[d.properties.name]); };
  228. svg.append("g")
  229. .selectAll("path")
  230. .data(usMap.features)
  231. .enter().append("path")
  232. .attr("d", path)
  233. .attr("fill", colored)
  234. .attr("class", "state-boundary")
  235. .classed("highlight", false)
  236. }
  237.  
  238.  
  239. bars.append("rect")
  240. .attr("x", midX)
  241. .attr("y", 0)
  242. .attr("width", function(d) { return x(d.values[0].value); })
  243. .attr("height", y.bandwidth())
  244. .classed("highlight", function(d) { return d.key == '15-0000'; })
  245. .on("mouseover", jobMouseEnter)
  246.  
  247. bars.append("text")
  248. .attr("x", midX - 4)
  249. .attr("y", 12)
  250. .style("text-anchor", "end")
  251. .text(function(d) { var label = d.values[0].key.slice(0,-12);
  252. if (label.length > 33) {
  253. label = label.slice(0,30) + "...";
  254. }
  255. return label; });
  256. }
  257.  
  258. function processData(errors, usMap, jobsData) {
  259. console.log("Errors", errors)
  260. createBars("#bars", jobsData, 2012, "15-0000");
  261. updateBars("#bars", jobsData, 2016, "15-0000");
  262.  
  263. createBrushedVis("#brushed", usMap, jobsData, 2016);
  264. }
  265.  
  266. d3.queue()
  267. // use these two files
  268. .defer(d3.json, "http://www.cis.umassd.edu/~dkoop/cis468-2017sp/a4/us-states.json")
  269. .defer(d3.csv, "http://www.cis.umassd.edu/~dkoop/cis468-2017sp/a4/occupations.csv")
  270. .await(processData);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement