block by NPashaP 66c87a659d4e72570eba3d6d9a08591b

Viz - Area - stacked - legend - mouse

Full Screen

index.html

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
  </head>
<style>
.viz-area .area{
  fill: steelblue;
  stroke: none;
}
.viz-legend:hover{
  cursor:pointer;
}
</style>
<body>
<svg width="960" height="600">
<g transform="translate(50,50)" id="areas"></g>
<g transform="translate(300,500)" id="legend"></g>
</svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="//vizjs.org/viz.v1.3.0.min.js"></script>
<script>
var fill = {"value1":"#880E4F", "value2":"#AD1457", "value3":"#F06292", "value4":"#F48FB1"};
var keys = ["value1","value2","value3","value4"];

var data = randomData();

var stack = d3.stack().keys(keys)(data);

var area = viz.area()
	.key(function(d){ return d.data.key})
	.value0(function(d){ return d[0]})
	.value1(function(d){ return d[1]})
	.keyScale(d3.scaleLinear().domain([0,20]).range([0,880]))
	.valueScale(d3.scaleLinear().domain([0,4]).range([420,0]))
	.curve(d3.curveBasis)
	
var areas = d3.select("#areas")
	.selectAll(".areas")
	.data(stack)
	.enter()
	.append("g")
	.attr("class","areas")
	.append("path")
	.attr("d",function(d){ return area.data(d).path()})
	.style("fill",function(d,i){ return fill[d.key]})

var legend = viz.legend()
	.data(keys)
	.rows(1)
	.width(300)
	.fill(function(d){ return fill[d]})
	.onMouseOver(onMouseOver)
	.onMouseOut(onMouseOut)
	
d3.select("#legend").call(legend)
	
function randomData(){
	return d3.range(20).map(function(i){ return {key:i, value1: Math.random(), value2: Math.random(), value3: Math.random(), value4: Math.random()}; });
}

function onMouseOver(k){  
  var newdata = data.map(function(d){ return (r = {key:d.key, value1:0, value2:0, value3:0, value4:0}, r[k]=d[k], r); });
	
  d3.select("#areas")
	.selectAll(".areas")
	.data(d3.stack().keys(keys)(newdata))
	.transition().duration(500)
	.select("path")
	.attr("d",function(d){ return area.data(d).path()})
}

function onMouseOut(k){
  d3.select("#areas")
	.selectAll(".areas")
	.data(d3.stack().keys(keys)(data))
	.transition().duration(500)
	.select("path")
	.attr("d",function(d){ return area.data(d).path()})
}

 // adjust the bl.ocks frame dimension.
d3.select(self.frameElement).style("height", "600px"); 
</script>