The main problem with your script is that d3 code is executed only once. When you have multiple data sets, the d3 template (bind, add, update, remove) should be called every time the data is updated.
Here is a rough outline of what you need:
// config, add svg var canvas = d3.select('body') .append('svg') .attr('width',100) .attr('height',100) .appeng('g'); // function that wraps around the d3 pattern (bind, add, update, remove) function updateLegend(newData) { // bind data var appending = canvas.selectAll('rect') .data(newData); // add new elements appending.enter().append('rect'); // update existing elements appending.transition() .duration(0) .attr("width",function (d) {return dy; }); // remove old elements appending.exit().remove(); } // generate initial legend updateLegend(initialValues); // handle on click event d3.select('#opts') .on('change', function() { var newData = eval(d3.select(this).property('value')); updateLegend(newData); });
Here is a working fiddle that demonstrates how to change data using selection (perhaps it needs to be customized for your needs):
http://jsfiddle.net/spanndemic/5JRMt/
source share