Built with blockbuilder.org
forked from GerardoFurtado's block: fresh block
| license: mit |
Built with blockbuilder.org
forked from GerardoFurtado's block: fresh block
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <body> | |
| <div id="div1"></div> | |
| <div id="div2"></div> | |
| </body> | |
| <script src="https://d3js.org/d3.v4.js"></script> | |
| <script> | |
| var parseDate = d3.timeParse("%Y-%m-%d"); | |
| function type2(d, i, columns) { | |
| d.date = parseDate(d.date); | |
| return d; | |
| } | |
| function type(d, i, columns) { | |
| d.date = parseDate(d.date); | |
| for (var i = 1, n = columns.length; i < n; ++i) d[columns[i]] = d[columns[i]] / 100; | |
| return d; | |
| } | |
| function drawGraph(error, data, selector, width, height) { | |
| console.log(data); | |
| var svg = d3.select(selector).append("svg") | |
| .attr("width", width) | |
| .attr("height", height), | |
| margin = {top: 20, right: 20, bottom: 30, left: 50}, | |
| width = svg.attr("width") - margin.left - margin.right, | |
| height = svg.attr("height") - margin.top - margin.bottom; | |
| var x = d3.scaleTime().range([0, width]), | |
| y = d3.scaleLinear().range([height, 0]), | |
| z = d3.scaleOrdinal(d3.schemeCategory10); | |
| var stack = d3.stack(); | |
| var area = d3.area() | |
| .x(function (d, i) { | |
| return x(d.data.date); | |
| }) | |
| .y0(function (d) { | |
| return y(d[0]); | |
| }) | |
| .y1(function (d) { | |
| return y(d[1]); | |
| }); | |
| var g = svg.append("g") | |
| .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
| var keys = data.columns.slice(1); | |
| x.domain(d3.extent(data, function (d) { | |
| return d.date; | |
| })); | |
| z.domain(keys); | |
| stack.keys(keys); | |
| console.log(stack(data)) | |
| var layer = g.selectAll(".layer") | |
| .data(stack(data)) | |
| .enter().append("g") | |
| .attr("class", "layer"); | |
| layer.append("path") | |
| .attr("class", "area") | |
| .style("fill", function (d) { | |
| return z(d.key); | |
| }) | |
| .attr("d", area); | |
| layer.filter(function (d) { | |
| return d[d.length - 1][1] - d[d.length - 1][0] > 0.01; | |
| }) | |
| .append("text") | |
| .attr("x", width - 6) | |
| .attr("y", function (d) { | |
| return y((d[d.length - 1][0] + d[d.length - 1][1]) / 2); | |
| }) | |
| .attr("dy", ".35em") | |
| .style("font", "10px sans-serif") | |
| .style("text-anchor", "end") | |
| .text(function (d) { | |
| return d.key; | |
| }); | |
| g.append("g") | |
| .attr("class", "axis axis--x") | |
| .attr("transform", "translate(0," + height + ")") | |
| .call(d3.axisBottom(x)); | |
| g.append("g") | |
| .attr("class", "axis axis--y") | |
| .call(d3.axisLeft(y).ticks(10, "%")); | |
| } | |
| d3.csv("market_shares.csv", type2, function (error, data) { | |
| let stackedByDate = {} | |
| let drugSet = new Set(); | |
| let defaultDrugMarketShareProp = {}; | |
| let newData = [] | |
| data.forEach(function (item, index) { | |
| drugSet.add(item.drug); | |
| stackedByDate[item.date] = {}; | |
| }); | |
| let drugNames = [...drugSet]; | |
| drugNames.forEach(function (item, index) { | |
| defaultDrugMarketShareProp[item] = 0; | |
| }); | |
| data.forEach(function (item, index) { | |
| stackedByDate[item.date] = Object.assign({}, defaultDrugMarketShareProp); | |
| }); | |
| data.forEach(function (item, index) { | |
| stackedByDate[item.date][item.drug] = item.market_share; | |
| }); | |
| Object.keys(stackedByDate).forEach(function (key) { | |
| hash = {} | |
| hash['date'] = new Date(key); | |
| Object.keys(stackedByDate[key]).forEach(function (innerKey) { | |
| hash[innerKey] = stackedByDate[key][innerKey] | |
| }); | |
| newData.push(hash); | |
| }); | |
| newData.columns = drugNames; | |
| newData.columns.unshift('date'); | |
| drawGraph(error, newData, "#div2", 960, 500); | |
| }); | |
| </script> |