J'ai des difficultés à faire apparaître une ligne verticale sur trois graphiques linéaires similaires (même ensemble de données).
Var testdate1
contient une date, qui se trouve sur le graphique (en haut de la lc1.on(renderlet)
fonction) à la position 4 de l'index (4e "cercle.point" sur le graphique linéaire).
Comment ajouter une ligne verticale au graphique à cette position ? (Je souhaite ajouter des lignes verticales à la même position sur les trois graphiques linéaires, mais je pense que la procédure sera la même pour les trois).
De plus, pour une raison quelconque, je n'arrive pas à faire en sorte que le cercle situé à cet endroit se présente sous la forme d'un point rouge ou vert, alors qu'il fonctionne dans l'application cette réponse SO par davcs86 -- mais dans son exemple, nous localisons le point en utilisant l'axe des x (date), et ce code utilise le numéro d'index dans la collection alldotsN -- je ne vois pas non plus ce que je fais de mal ici.
<a href="http://jsfiddle.net/rvz1bnu5/" rel="nofollow noreferrer"><strong>jsFiddle to experiment with</strong></a>
var chartHeight = 250;
var chartWidth = 500;
var myCSV = [
{"shift":"1","date":"01/01/2016/08/00/00/+0500","car":"178","truck":"125","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00/+0500","car":"125","truck":"189","bike":"125","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00/-0500","car":"140","truck":"219","bike":"328","moto":"1252"},
{"shift":"4","date":"02/01/2016/17/00/00/+0500","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00/+0500","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00/+0500","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00/+0500","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00/+0500","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00/+0500","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00/+0500","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00/+0500","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00/+0500","car":"230","truck":"170","bike":"390","moto":"400"}
];
var testdate1 = +new Date('Sun Jan 03 2016 08:00:00 GMT-0500 (Eastern Standard Time)');
lc1 = dc.lineChart("#line1");
lc2 = dc.lineChart("#line2");
lc3 = dc.lineChart("#line3");
var dateFormat = d3.time.format("%d/%m/%Y/%H/%M/%S/%Z");
myCSV.forEach(function (d) {
d.date = dateFormat.parse(d.date);
d.car = +d.car;
d.bike = +d.bike;
d.moto = +d.moto;
});
var facts = crossfilter(myCSV);
var dateDim = facts.dimension(function (d) {return d.date});
var carDim = facts.dimension(function (d) {return d['car']});
var dgCar = dateDim.group().reduceSum(function (d) {return d['car']});
var bikeDim = facts.dimension(function (d) {return d['bike']});
var dgBike = dateDim.group().reduceSum(function (d) {return d['bike']});
var motoDim = facts.dimension(function (d) {return d['moto']});
var dgMoto = dateDim.group().reduceSum(function (d) {return d['moto']});
var minDate = myCSV[0].date; //new Date ("2016-01-01T08:00:00.000Z");
var maxDate = myCSV[myCSV.length-1].date; //new Date ("2016-01-06T17:00:00.000Z");
lc1
.renderArea(false)
.width(chartWidth)
.height(chartHeight)
.dimension(dateDim)
.group(dgCar)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Cars')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc1.yAxis().ticks(5);
lc1.xAxis().ticks(3);
lc2
.renderArea(false)
.width(chartWidth)
.height(chartHeight)
.dimension(dateDim)
.group(dgBike)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Bikes')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc2.yAxis().ticks(5);
lc2.xAxis().ticks(3);
lc3
.renderArea(false)
.width(chartHeight)
.height(250)
.dimension(dateDim)
.group(dgMoto)
.defined(function(d) {if(d.y !==null) {return d.y;}})
.transitionDuration(1000)
.margins({top: 30, right: 20, bottom: 35, left: 60})
.yAxisLabel('Motos')
.renderHorizontalGridLines(true)
.brushOn(false)
.x(d3.time.scale().domain([minDate,maxDate]));
lc3.yAxis().ticks(5);
lc3.xAxis().ticks(3);
lc1.on('renderlet', function(lc1) {
var thespot;
var allDots1 = lc1.selectAll('circle.dot');
allDots1.filter(function(d,i){ //d==datum (obj), i==index (of datapoint on line)
if (+d.x===testdate1) thespot = i;
});
console.log('found spot: ' +thespot); //== 4th position on line
//display red circle - NOT WORKING
alldots1.filter((d,i) => i === thespot).classed('reddot',true);
alldots2.filter((d,i) => i === thespot).classed('greendot',true);
alldots3.filter((d,i) => i === thespot).classed('greendot',true);
//display vertical line on all 3 graphs at same point - NOT WORKING
alldots1
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
alldots2
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
alldots3
.filter((d,i) => +i === +thespot)
.append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
.style("stroke-width", 2)
.style("stroke", "red")
.style("fill", "none");
});//END lc1.renderlet
dc.renderAll();
dc.redrawAll();
.reddot {
stroke: red !important;
fill: red !important;
fill-opacity: 1 !important;
}
.greendot {
stroke: green;
fill: green;
fill-opacity: 1 !important;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.1/crossfilter.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.3.3/d3.min.js"></script>
<script src="//dc-js.github.io/dc.js/js/dc.js"></script>
<link href="stackoverflow.com//dc-js.github.io/dc.js/css/dc.css" rel="stylesheet" />
<svg id="line1"></svg>
<svg id="line2"></svg>
<svg id="line3"></svg>