Built with blockbuilder.org
forked from riff4's block: Lecture 3 HW - version 0.1
forked from riff4's block: Lecture 3 HW - version 0.2
forked from riff4's block: Lecture 3 HW - version 0.3
xxxxxxxxxx
<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>
var data=d3.csv('stocks.csv',function(error, data){
var dataset=data;
data.forEach(function(d){
d.price = +d.price;
d.date = d.date.substring(d.date.length - 4);
})
function sommeAnneeSymbol(year,symbol){
var somme = 0;
data.forEach(function(d){
if (d.date==year && d.symbol==symbol){
somme += d.price
}
})
return somme
}
function sommeAnnee(year){
var somme = 0;
data.forEach(function(d){
if (d.date==year){
somme += d.price
}
})
return somme
}
function sommeStacked(year,symbol){
var somme = 0;
var symbols=d3.map(data,function(d){ return d.symbol;}).keys();
var i = 0;
var cond = (symbols[i]==symbol);
while (i<=symbols.length && !cond){
somme += sommeAnneeSymbol(year,symbols[i]);
i++;
cond = (symbols[i]==symbol);
}
return (somme + sommeAnneeSymbol(year,symbol))
}
var color = d3.scaleOrdinal(d3.schemeCategory20);
var svg = d3.select("body").append("svg")
.attr("width", 960)
.attr("height", 500);
var x0 = d3.scaleBand()
.range([0, d3.select("svg").attr("width")])
.domain(d3.map(data,function(d){ return d.date; }).keys());
var y0 = d3.scaleLinear()
.domain([0, d3.max(data, function(d){return sommeAnnee(d.date)})])
.range([0, +d3.select("svg").attr("height")-150]);
var z0 = d3.scaleBand()
.range([0,x0.bandwidth()])
.domain(d3.map(data,function(d){ return d.symbol; }).keys());
var s = svg.selectAll("rect").data(data);
s.enter()
.append("rect")
svg.selectAll("rect")
.attr("class", "bar")
.attr("width", function(d, i) {return 0.9*x0.bandwidth(); })
.attr("height", function(d, i) { return y0(sommeAnneeSymbol(d.date,d.symbol)); })
.attr("x", function(d, i) {return x0(d.date); })
.attr("y", function(d) { return 400 - y0(sommeStacked(d.date,d.symbol)); })
.style("fill", function(d){return color(d.symbol)})
.style('opacity',100)
var etat = "stacked"
function stacked(){
svg.selectAll("rect.bar").transition()
.duration(1000)
.attr("y", function(d) { return 400 - y0(sommeStacked(d.date,d.symbol)); })
.transition()
.attr("width", function(d, i) {return 0.9*x0.bandwidth(); })
.attr("x", function(d, i) {return x0(d.date); })
}
function grouped(){
svg.selectAll("rect.bar").transition()
.duration(1000)
.attr("width", function(d, i) {return x0.bandwidth()/d3.map(data,function(d){ return d.symbol;}).keys().length; })
.attr("x", function(d, i) {return x0(d.date)+z0(d.symbol); })
.transition()
.attr("y", function(d) { return 400 - y0(sommeAnneeSymbol(d.date,d.symbol)); })
}
d3.selectAll("svg")
.on('click',function(){console.log(etat);
if (etat=="stacked"){grouped(); etat ="grouped"}
else {stacked(); etat = "stacked"}
})
var years = d3.map(data,function(d){ return d.date;}).keys();
for (var i=0; i<years.length; i++) {console.log(years[i]);
svg.append("text")
.attr("x",x0(years[i])+(0.9*x0.bandwidth()/2))
.attr("y",425)
.text(years[i])
.attr("text-anchor","middle")
}
var legend = svg.selectAll(".legend")
.data(color.domain())
.enter().append("g")
.attr("class", "legend")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("x", 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 40)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "start")
.text(function(d) {console.log(d); return d });
})
</script>
</body>
https://d3js.org/d3.v4.min.js