Built with blockbuilder.org
forked from romsson's block: Grouped bar chart v4
forked from anonymous's block: Grouped bar chart - transition
forked from anonymous's block: Grouped bar chart - transition
xxxxxxxxxx
<style>
.legend {
padding: 5px;
font: 10px sans-serif;
background: yellow;
box-shadow: 2px 2px 1px #888;
}
</style>
<body>
<label>
<input type="radio" name="brand" value="Option1" checked="true"/>
</label>
<label>
<input type="radio" name="brand" value="Option2" />
</label>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
var t = d3.transition()
.duration(750)
.ease(d3.easeLinear);
var n = 4, // number of samples
m = 11; // number of series
var is_stacked =true;
var brands = ['Stacked Mode', 'Bar Mode']
var radios =
d3.select('.panel.left').selectAll('input[name="brand"]').data(brands);
var labels = radios.enter()
.append("label")
.append("input")
.on('change', function() {
renderValues(this.value);
})
.attr("type", "radio")
.attr("name", "brand")
.attr("value", function(d) { return d; })
.attr('checked', function(d) { if (d === brands[0]) { return 'checked' }; });
d3.selectAll("label")
.data(brands)
.append("text")
.text(function(d) { return d; })
.style("font-family", "Arial")
.style("font-size", 12)
.style("font-weight", "bold");
d3.csv('stocks.csv', function(error, data){
data.forEach(function(d) {
d.price = +d.price
d.date = d.date.slice(-4)
;})
var data_reshaped = d3.nest()
.key(function(d) {return d.date;})
.sortKeys(d3.ascending)
.key(function(d) {return d.symbol;})
.rollup(function(d) {
return {
avg_stock_value:d3.mean(d,function(g) {return +g.price})
}})
.entries(data);
dataFormat = d3.range(m).map(function(index) {
return d3.range(n).map(function(i) {
return Math.round(data_reshaped[index].values[i].value.avg_stock_value*10)/10
});
})
console.log(dataFormat)
data_stacked = d3.stack().keys(d3.range(m))(dataFormat)
var max = d3.max(data_stacked,function(d,index){
return d[10][0]});
var max1 = d3.max(data,function(d,index){
return +d.price});
var margin = {top: 20, right: 20, bottom: 20, left: 20},
width = 960 - margin.left - margin.right,
height = 460 - margin.top - margin.bottom;
var y = d3.scaleLinear()
.domain([0, max])
.rangeRound([height, 0])
.nice();
var y_bis = d3.scaleLinear()
.domain([0, max1])
.rangeRound([height, 0])
.nice();
var x = d3.scaleBand()
.rangeRound([0, width])
.paddingInner(0.05)
.align(0.1)
.domain(d3.range(m));
var z = d3.scaleOrdinal()
.range(["#fe9c23","#d0743c","#a05d56","#6b486b"]);
var color_hash = ["#fe9c23","#d0743c","#a05d56","#6b486b"];
var firms = [{"MSFT":"#fe9c23"},{"AAPL":"#d0743c"},{"IBM":"#a05d56"},{"AMZN":"#6b1644b"}]
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 + ")");
var bar_group = svg.append("g").selectAll("g")
.data(d3.stack().keys(d3.range(n))(dataFormat))
.enter().append("g")
.style("fill", function(d) {
return z(d.key); })
.selectAll("rect")
.data(function(d) { return d; })
.enter()
bar_group.append("rect")
.attr("x", function(d, i) {
return x(i); })
.attr("y", function(d) {
return y(d[1]); })
.attr("height", function(d) {
return y(d[0]) - y(d[1]); })
.attr("width", x.bandwidth())
bar_group.append("text")
.attr("x", function(d, i) {
return x(i)+10; })
.attr("y", function(d) {
return y(d[1])+(y(d[0]) - y(d[1]))/2-2; })
.attr("transform", function(d) {
return "translate(" + 30 + "," + 5 + ")";
})
.attr("text-anchor", "middle").text(function(d){
return -(Math.round((d[0] - d[1])*10))/10;}).style("fill", "white")
.style("font-family", "Arial")
.style("font-size", 8);
d3.select("body").selectAll("input").on("change", function() {
svg.select("g").selectAll("g").each(function(d,index) {
d3.select(this).selectAll("text").each(function(){
if(is_stacked){
d3.select(this).style("opacity",0)
} else {
d3.select(this).transition(t).delay(800).style("opacity",1);
}
})
d3.select(this).selectAll("rect").each(function(e, i) {
if (is_stacked) {
d3.select(this).transition(t)
.attr("x", function() {
return x(i) + (index) * x.bandwidth() / 4
})
.attr("width", function() {
return x.bandwidth() / 5
})
.transition(t).delay(500)
.attr("y", function(d) {
return height - (y_bis(d[0]) - y_bis(d[1]));
})
.attr("height", function(d){
return y_bis(d[0]) - y_bis(d[1]);
})
} else {
d3.select(this).transition()
.attr("y", function(d) {
return y(d[1]);
})
.attr("height", function(d) {
return y(d[0]) - y(d[1])
})
.transition().delay(500)
.attr("width", function() {
return x.bandwidth()
})
// .transition(t)
.attr("x", function() {
return x(i)
})
}
})
})
is_stacked = !is_stacked;
})
});
</script>
https://d3js.org/d3.v4.min.js