|
function drugBarGroup(chartArea){ |
|
d3.select('#drugBar-area').html(''); |
|
var margin = {top: 20, right: 20, bottom: 30, left: 40}, |
|
width = 960 - margin.left - margin.right, |
|
height = 500 - margin.top - margin.bottom; |
|
|
|
var x0 = d3.scaleBand() |
|
.rangeRound([0, width]).padding(0.2); |
|
|
|
var x1 = d3.scaleBand(); |
|
|
|
var y = d3.scaleLinear() |
|
.range([height, 0]); |
|
|
|
var xAxis = d3.axisBottom() |
|
.scale(x0) |
|
.tickSize(0); |
|
|
|
var yAxis = d3.axisLeft() |
|
.scale(y); |
|
|
|
|
|
var color = d3.scaleOrdinal() |
|
.range(["#ca0020","#f4a582","#d5d5d5","#92c5de","#0571b0"]); |
|
|
|
var svg = d3.select('body').append("svg") |
|
.attr("width", width + margin.left + margin.right) |
|
.attr("height", height + margin.top + margin.bottom) |
|
.append("g") |
|
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); |
|
|
|
d3.json("drug.json", function(error, data) { |
|
|
|
var categoriesNames = data.map(function(d) { return d.s_category; }); |
|
var rateNames = data.map(function(d) { return d.drug_cat; }); |
|
console.log(categoriesNames); |
|
|
|
x0.domain(categoriesNames); |
|
x1.domain(rateNames).rangeRound([0, x0.bandwidth()]); |
|
|
|
const nestedData = d3.nest() |
|
.key(function(d){return d.s_category}) |
|
.entries(data); |
|
|
|
y.domain([0, d3.max(nestedData, function(s_category) { |
|
return d3.max(s_category.values, |
|
function(d) { |
|
return d.count; }); })]); |
|
|
|
svg.append("g") |
|
.attr("class", "x axis") |
|
.attr("transform", "translate(0," + height + ")") |
|
.call(xAxis); |
|
|
|
svg.append("g") |
|
.attr("class", "y axis") |
|
.style('opacity','0') |
|
.call(yAxis) |
|
.append("text") |
|
.attr("transform", "rotate(-90)") |
|
.attr("y", 6) |
|
.attr("dy", ".71em") |
|
.style("text-anchor", "end") |
|
.style('font-weight','bold') |
|
.text("Value"); |
|
|
|
svg.select('.y').transition().duration(500).delay(1300).style('opacity','1'); |
|
|
|
var slice = svg.selectAll(".slice") |
|
.data(nestedData) |
|
.enter().append("g") |
|
.attr("class", "g") |
|
.attr("transform",function(d) { return "translate(" + x0(d.key) + ",0)"; }); |
|
|
|
slice.selectAll("rect") |
|
.data(function(d) { return d.values; }) |
|
.enter().append("rect") |
|
.attr("width", x1.bandwidth()) |
|
.attr("x", function(d) { return x1(d.drug_cat); }) |
|
.style("fill", function(d) { return color(d.drug_cat) }) |
|
.attr("y", function(d) { return y(0); }) |
|
.attr("height", function(d) { return height - y(0); }) |
|
.on("mouseover", function(d) { |
|
d3.select(this).style("fill", d3.rgb(color(d.drug_cat)).darker(2)); |
|
}) |
|
.on("mouseout", function(d) { |
|
d3.select(this).style("fill", color(d.drug_cat)); |
|
}); |
|
|
|
slice.selectAll("rect") |
|
.transition() |
|
.delay(function (d) {return Math.random()*1000;}) |
|
.duration(1000) |
|
.attr("y", function(d) { return y(d.count); }) |
|
.attr("height", function(d) { return height - y(d.count); }); |
|
|
|
}); |
|
|
|
} |
|
drugBarGroup("#drugBar-area"); |