Thanks for your help. I'll try with the <g> containers.
It will be hard for a live example as my chart is inside a Wordpress page running with Mamp on my computer.
The jQuery slider control the whole page, refresh datas and charts. This part works.
Here is the code (probably a big mess. I'm graphic designer and I find d3 hard to learn ;))
$(document).ready(function(){
var w=440;
var h=320;
var samples = 8;
var defaultDay = 1;
var hash = window.location.hash;
hash = hash.substring(1,hash.length);
if(hash)
{
defaultDay = hash;
}
else
{
defaultDay = 1;
}
var y0 = d3.scale.linear().domain([0, 15000]).range([0,h]);
var x0 = d3.scale.ordinal().domain(d3.range(samples)).rangeBands([0, w], 0.2),
x1 = d3.scale.ordinal().domain(d3.range(2)).rangeBands([0, x0.rangeBand()]);
var chart = d3.select("#chartByTransport").append("svg")
.attr("class", "chart")
.attr("width",w)
.attr("height", h)
.append("svg:g")
.attr("transform", "translate(0,-30)");
var data = [];
var noms = ["alex","greg"];
var transports = ["Vélo","Bus","Train","Stop","Moto","VéloMoto","Bateau","Avion"];
data = d3.nest()
.map(csv);
var aMaxId = 0;
var gMaxId = 0;
var maxId = 0;
for (var i=0; i<data.length; i++)
{
if(data[i].aLieuArrivee != "")
{
aMaxId++;
}
}
for (var i=0; i<data.length; i++)
{
if(data[i].gLieuArrivee != "")
{
gMaxId++;
}
}
if(aMaxId >= gMaxId)
{
maxId = gMaxId;
}else
{
maxId = aMaxId;
}
$('#sliderControl').slider({
range: "min",
value: 100,
min: 1,
max: maxId,
animate: true,
slide: function( event, ui ) {
$( "#sliderValue" ).text(ui.value );
updateGraphD3(ui.value);
}
});
var alexData = [parseInt(data[defaultDay].aVeloKmTotaux),parseInt(data[defaultDay].aBusKmTotaux),parseInt(data[defaultDay].aTrainKmTotaux),parseInt(data[defaultDay].aStopKmTotaux),parseInt(data[defaultDay].aMotoKmTotaux),parseInt(data[defaultDay].aVelomotoKmTotaux),parseInt(data[defaultDay].aBateauKmTotaux),parseInt(data[defaultDay].aBAvionKmTotaux)];
var gregData = [parseInt(data[defaultDay].gVeloKmTotaux),parseInt(data[defaultDay].gBusKmTotaux),parseInt(data[defaultDay].gTrainKmTotaux),parseInt(data[defaultDay].gStopKmTotaux),parseInt(data[defaultDay].gMotoKmTotaux),parseInt(data[defaultDay].gVelomotoKmTotaux),parseInt(data[defaultDay].gBateauKmTotaux),parseInt(data[defaultDay].gAvionKmTotaux)];
var combinedData = [alexData,gregData];
var g = chart.selectAll("g")
.data(combinedData)
.enter()
.append("svg:g")
.attr("class",function(d,i) {return noms[i]})
.attr("transform", function(d, i) {return "translate(" + x1(i) + ",0)";});
var rect = g.selectAll("rect")
.data(Object)
.enter()
.append("svg:rect")
.attr("transform", function(d, i) {return "translate(" + x0(i) + ",0)";})
.attr("width", x1.rangeBand())
.attr("height", function(d,i) {
return y0(d)+1;
})
.attr("y", function(d,i) {
return h-y0(d)-1;
}
);
});
function updateGraphD3(jour)
{
window.location.hash = jour;
alexData = [parseInt(data[jour].aVeloKmTotaux),parseInt(data[jour].aBusKmTotaux),parseInt(data[jour].aTrainKmTotaux),parseInt(data[jour].aStopKmTotaux),parseInt(data[jour].aMotoKmTotaux),parseInt(data[jour].aVelomotoKmTotaux),parseInt(data[jour].aBateauKmTotaux),parseInt(data[jour].aAvionKmTotaux)];
var gregData = [parseInt(data[jour].gVeloKmTotaux),parseInt(data[jour].gBusKmTotaux),parseInt(data[jour].gTrainKmTotaux),parseInt(data[jour].gStopKmTotaux),parseInt(data[jour].gMotoKmTotaux),parseInt(data[jour].gVelomotoKmTotaux),parseInt(data[jour].gBateauKmTotaux),parseInt(data[jour].gAvionKmTotaux)];
d3.select(".alex").selectAll("rect")
.data(alexData)
.transition()
.duration(500)
.attr("height", function(d,i,j) {
return y0(d)+1;
})
.attr("y", function(d,i,j) {
return h-y0(d)-1;
}
);
d3.select(".greg").selectAll("rect")
.data(gregData)
.transition()
.duration(500)
.attr("height", function(d,i,j) {
return y0(d)+1;
})
.attr("y", function(d,i,j) {
return h-y0(d)-1;
}
);
}
});