diff --git a/js/diagrams.js b/js/diagrams.js index 6901fc0..d4a8109 100644 --- a/js/diagrams.js +++ b/js/diagrams.js @@ -3,6 +3,8 @@ // https://bl.ocks.org/mbostock/3884955 function createLineGraph(containerId, raceData){ + console.log(raceData); + var height = 1000; var width = 1000; @@ -15,8 +17,6 @@ function createLineGraph(containerId, raceData){ var x = d3.scaleLinear().range([0, width]); var y = d3.scaleLinear().range([height, 0]); - var allLineData = transformRaceDataToLineData(raceData); - // defines how the passed in Data, at "svg.append" shall be interpreted var lineDataDefinition = d3.line() .x(function(d) { return x(d.lap); }) @@ -36,14 +36,29 @@ function createLineGraph(containerId, raceData){ x.domain([0, raceData.lapTimes.size]); y.domain([raceData.drivers.length, 1]); + var enhancedLapData = processor.getEnhancedLapDataPerDriver(raceData); + console.log(enhancedLapData); + // Adds all lines - allLineData.forEach((singleLineData, i) => { - svg.append("path") - .data([singleLineData]) - .attr("class", "line") - .attr("stroke", getColorValue(i, allLineData.length) ) - .attr("d", lineDataDefinition) - ; + enhancedLapData.forEach((driverLapData, driverIndex) => { + svg.append("path") + .data([driverLapData.laps]) + .attr("class", "line") + .attr("stroke", getColorValue(driverIndex, enhancedLapData.length) ) + .attr("d", lineDataDefinition) + + //Appends a circle for each datapoint + svg.selectAll(".linepoint") + .data(driverLapData.laps) + .enter().append("circle") // Uses the enter().append() method + .attr("class", "dot") // Assign a class for styling + .attr("fill", getColorValue(driverIndex, enhancedLapData.length)) + .attr("cx", function(d, i) {return x(d.lap) }) + .attr("cy", function(d, i) { return y(d.position) }) + .attr("r", 3) + .on("mouseover", handleMouseOverLinePoint) + .on("mouseout", handleMouseOutLinePoint); + }); // Add the X Axis @@ -58,14 +73,35 @@ function createLineGraph(containerId, raceData){ .call(d3.axisRight(y)) .attr("transform", "translate( " + (width) + ", 0 )"); -console.log(transformPitStopDataToPointData(raceData)); - // 12. Appends a circle for each datapoint - svg.selectAll(".dot") - .data(transformPitStopDataToPointData(raceData)) - .enter().append("circle") // Uses the enter().append() method - .attr("class", "dot") // Assign a class for styling - .attr("cx", function(d, i) { return x(d.lap) }) - .attr("cy", function(d) { return y(d.position) }) - .attr("r", 5); + function handleMouseOverLinePoint(d, i) { + console.log(d); + console.log(i); + // Add interactivity + // Use D3 to select element, change color and size + d3.select(this).attr({ + fill: "orange", + r: 3 * 2 + }); + + // Specify where to put label of text + svg.append("text") + .attr("id", "t" + d.lap + "-" + d.positon + "-" + i)// Create an id for text so we can select it later for removing on mouseout + .attr("x", function() { return x(d.lap) - 30; }) + .attr("y", function() { return y(d.position) - 15; }) + .text(function() { + return [d.lap, d.position]; // Value of the text + }); + } + + function handleMouseOutLinePoint(d, i) { + // Use D3 to select element, change color back to normal + d3.select(this).attr({ + fill: "black", + r: 3 + }); + + // Select text by id and then remove + d3.select("#t" + d.lap + "-" + d.positon + "-" + i).remove(); // Remove text location + } } diff --git a/js/processor.js b/js/processor.js index cb1193b..93f1b98 100644 --- a/js/processor.js +++ b/js/processor.js @@ -10,7 +10,7 @@ var processor = { qualifying: null, results: null, raceInfo: null, - + }; race.drivers = queries.getDriversByRaceId(raceId); @@ -31,22 +31,21 @@ getEnhancedLapDataPerDriver: function(raceData) { laps: [], }; lapData.driver = driver; + //Attach Qualifying Data + lapData.qualifying = processor.getQualifyingForDriver(raceData, driver); + //add Qualifying Data to the Laps + lapData.laps.push({'driverId': driver.driverId, 'lap': 0, 'position': lapData.qualifying.position}) raceData.lapTimes.forEach(lap => { lap.forEach(curLap => { if( curLap.driverId == driver.driverId ){ - var pitstop = raceData.pitStops.filter(pitstop => pitstop.driverId == driver.driverId && pitstop.lap == curLap.lap); + var pitstop = raceData.pitStops.filter(pitstop => pitstop.driverId == driver.driverId && pitstop.lap == curLap.lap); if(pitstop.length > 0){ curLap.pitStop = pitstop[0]; } - lapData.laps.push(curLap); } }); }); - - - - result.push(lapData); }); return result; @@ -58,7 +57,7 @@ getEnhancedLapDataPerDriver: function(raceData) { }, //Gets the position of Driver with driverid in specific lap - // lapData: an array of the lap data for one lap + // lapData: an array of the lap data for one lap getPositionOfDriver: function(driver, lapData, defaultReturn){ var lapEntryWithDrivId = lapData.filter( drivLap => drivLap.driverId == driver.driverId ); if(lapEntryWithDrivId.length > 0){ @@ -68,4 +67,9 @@ getEnhancedLapDataPerDriver: function(raceData) { } }, + getQualifyingForDriver: function(raceData, driver){ + var qualData = raceData.qualifying.filter( qualData => qualData.driverId == driver.driverId); + return qualData[0]; + } + }; diff --git a/js/util.js b/js/util.js index 0ac7e4d..5d9fdb3 100644 --- a/js/util.js +++ b/js/util.js @@ -66,7 +66,7 @@ function transformPitStopDataToPointData(raceData){ for(var i = 0; i< randomData.length;i++){ if(randomData[i].driverId == pitStop.driverId){ position = randomData[i].position; - break; + break; } } //console.log(position); @@ -75,11 +75,6 @@ for(var i = 0; i< randomData.length;i++){ return pointData; } -function getPositionOfQualifying(raceData, driver){ - var qualData = raceData.qualifying.filter( qualData => qualData.driverId == driver.driverId); - return qualData[0].position; -} - // eigentlich war für TickData gedacht function getDriverCodeAndPositionArray(raceData, lapNumber){ var posDriverCode = [];