Built with blockbuilder.org
forked from hydrosquall's block: rocket_launch_barchart
| license: mit |
Built with blockbuilder.org
forked from hydrosquall's block: rocket_launch_barchart
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://d3js.org/d3.v4.min.js"></script> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
| </style> | |
| </head> | |
| <body> | |
| <script> | |
| // Section 1: Download and process the data | |
| var visualizeData = function(url) { | |
| d3.json(url, (data) => { // wrapper function | |
| const cleanedData = cleanData(data); | |
| renderChart(cleanedData); | |
| }); | |
| } | |
| var cleanData = function(data) { | |
| const cleaned = data.launches; | |
| // Prepare to process dates | |
| const dateParse = d3.timeParse("%Y%m%dT%H%M%S%Z"); | |
| const dateFormat = d3.timeFormat("%Y-%m-%d"); | |
| return cleaned.map((row)=> { | |
| // Pick out a subset of the interesting properties | |
| return { | |
| name: row.name, | |
| net: dateParse(row.isonet), // Convert ISO timestamp to Javascript Dates | |
| location: row.location, | |
| probability: +row.probability, // Convert string to number | |
| rocket: row.rocket, | |
| lsp: row.lsp, | |
| missions: row.missions, | |
| num_agencies: row.rocket.agencies.length | |
| } | |
| }); | |
| } | |
| var renderChart = function(data) { | |
| // Section 2: Create the graphical elements / code the display | |
| const margin = ({top: 20, | |
| right: 0, | |
| bottom: 30, | |
| left: 40}); | |
| const width = 500; | |
| const height = 400; | |
| // Create an HTML element to hold the chart | |
| const svg = d3.select("body") | |
| .append("svg") | |
| .attr("width", width) | |
| .attr("height", height); | |
| // Create scaling functions. First x axis, then y axis | |
| const xRange = [margin.left, width - margin.right]; | |
| const xScale = d3.scaleBand() | |
| .domain(data.map(d => d.name)) | |
| .range(xRange) | |
| .padding(0.15); // how much space to put around each bar | |
| const max_agencies = d3.max(data.map(d => d.num_agencies)); | |
| const num_agencies_range = [0 , max_agencies]; | |
| const yRange = [height - margin.bottom, margin.top].map(d => d/1); // scaling | |
| const yScale = d3.scaleLinear() | |
| .domain(num_agencies_range) | |
| .range(yRange) | |
| .nice(); | |
| // SECTION 3: Render the chart! | |
| var bar_color = function(row) { | |
| if (row.location.countryCode === "USA") { | |
| return "#78CDD7"; // pale turqoise saved from earlier | |
| } else { | |
| return "lightgrey"; | |
| } | |
| }; | |
| const yAxis = g => g | |
| .attr("transform", `translate(${margin.left}, 0)`) | |
| .call(d3.axisLeft(yScale) // place tickets to the left of the bar | |
| .ticks(max_agencies) | |
| // .tickSize(0) | |
| .tickFormat(d3.format("d")) | |
| ) | |
| .call(g => g.select(".domain").remove()) // Tufte style: remove the axis line | |
| // Build the final chart | |
| svg.append("g") | |
| .selectAll("rect") | |
| .data(data) | |
| .enter() | |
| .append("rect") | |
| .attr("x", d => xScale(d.name)) | |
| .attr("y", d => yScale(d.num_agencies) ) | |
| .attr("height", d => yScale(0) - yScale(d.num_agencies) ) | |
| .attr("width", xScale.bandwidth() / 2) | |
| .attr("fill", bar_color); | |
| svg.append("g") | |
| .call(yAxis); | |
| } | |
| // Wrapper function for the visualization | |
| const url = "https://launchlibrary.net/1.3/launch/next/15"; | |
| visualizeData(url); | |
| </script> | |
| </body> |