Advertisement
Guest User

Untitled

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