anchor.diff:  				.attr("y2", height)
   		}
   
  +		function yAxis(g) {
  +			g.call(d3.axisLeft(y).tickSizeOuter(0).tickSizeInner(0))
  +			g.selectAll(".domain").remove()
  +		}
  +
   		// axis
   		g.append("g")
   			.attr("class", "x axis")
   			.call(xAxis)
   		g.append("g")
   			.attr("class", "y axis")
  -			.call(d3.axisLeft(y))
  +			.attr("transform", "translate(" + (-margin.left + gutter) + ",0)")
  +			.style("text-anchor", "start")
  +			.call(yAxis)
   
   		// circles
   		for (var i = 0; i < data.length; i++) {
   
  +			// PREPROCESS
  +			let nest = d3.nest()
  +  			.key(d => d3.timeMonth(new Date(d.key)))
  +				.rollup(d => _.sumBy(d, 'value'))
  +				.entries(data[i].value)
  +
   			let g = svg.append("g")
   				.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
   
   			r.domain([0, d3.max(data[i].value, d => d.value)]);
   
   			g.selectAll("circle")
  -				.data(data[i].value)
  +				.data(nest)
  +				// .data(data[i].value)
   				.enter()
   				.append("circle")
   				.attr("class", "circle")
  
positive.code: 		// sizes
  		let container = d3.select(context)
  		let width = +container.node().getBoundingClientRect().width - margin.left - margin.right
  		let height = data.length * 25 + margin.top + margin.bottom // TODO: Cambair por algo más grande
  		let svg = container.append("svg")
  			.attr("width", width + margin.left + margin.right)
  			.attr("height", height + margin.top + margin.bottom)
  
negative.code: 		// scales
  	  let x = d3.scaleTime().range([0, width]);
  	  let y = d3.scalePoint().range([height, 0]);
  		let r = d3.scaleSqrt().range([0, 15]) // tamaño de las bolas
  
  		// domains
  		// TODO: Eliminar referencias a tipos de datos concretos
  		x.domain([
  			d3.timeMonth(new Date(d3.min(data.map(d => d3.min(d.value.map((t) => parseTime(new Date(t.key)))))))),
  			d3.timeMonth(new Date(d3.max(data.map(d => d3.max(d.value.map((t) => parseTime(new Date(t.key))))))))
  		]);
  		y.domain(data.map(d => d.key)).padding(0.5);
  
  