將垂直線添加到特定點處的折線圖在三條相似折線圖(相同數據集)之間建立垂直線有些困難。d3.js通過索引
瓦爾testdate1
包含日期,這是在該圖表(該lc1.on(renderlet)
函數的頂部)發現在索引POS 4(在應用於LineChart第四「circle.dot」)。
我該如何在該位置向圖表添加垂直線? (我希望在所有三個折線圖上的相同位置添加垂直線,但我希望這三個線圖都是相同的程序)。
此外,出於某種原因,我無法在該位置獲得圓形作爲紅色或綠色點的樣式,儘管它在this SO answer by davcs86中有效 - 但在他的示例中,我們使用x軸(日期),並且這段代碼在alldotsN集合中使用索引號 - 無法看到我在這裏做錯了什麼。
var chartHeight = 250;
var chartWidth = 500;
var myCSV = [ \t
{"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) {
\t d.date = dateFormat.parse(d.date);
\t d.car = +d.car;
\t d.bike = +d.bike;
\t 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; \t //new Date ("2016-01-06T17:00:00.000Z"); \t
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) {
\t var thespot;
\t var allDots1 = lc1.selectAll('circle.dot');
allDots1.filter(function(d,i){ //d==datum (obj), i==index (of datapoint on line)
\t \t if (+d.x===testdate1) thespot = i;
\t });
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
\t .filter((d,i) => +i === +thespot)
\t .append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
\t \t .style("stroke-width", 2)
\t \t .style("stroke", "red")
\t \t .style("fill", "none");
alldots2
\t .filter((d,i) => +i === +thespot)
\t .append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
\t \t .style("stroke-width", 2)
\t \t .style("stroke", "red")
\t \t .style("fill", "none");
alldots3
\t .filter((d,i) => +i === +thespot)
\t .append('line')
.attr('x1', +testdate1)
.attr('y1', chartHeight - margins.top)
.attr('x2', +testdate1)
.attr('y2', 0 + margins.top)
\t \t .style("stroke-width", 2)
\t \t .style("stroke", "red")
\t \t .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="//dc-js.github.io/dc.js/css/dc.css" rel="stylesheet" />
<svg id="line1"></svg>
<svg id="line2"></svg>
<svg id="line3"></svg>
一些第一想法:是否(renderlet)可以運行嗎?沒有在我的iPad上。因此,也沒有你期望的東西。圓形格式對我來說看起來沒問題,應該可以工作。追加行看起來不正確。你不應該將該行添加到svg嗎?它現在的方式將被添加到選定的圓圈內。 – Florian