class YearChart { /** * Constructor for the Year Chart * * @param electoralVoteChart instance of ElectoralVoteChart * @param tileChart instance of TileChart * @param votePercentageChart instance of Vote Percentage Chart * @param electionInfo instance of ElectionInfo * @param electionWinners data corresponding to the winning parties over mutiple election years */ constructor (electoralVoteChart, tileChart, votePercentageChart, electionWinners) { //Creating YearChart instance this.electoralVoteChart = electoralVoteChart; this.tileChart = tileChart; this.votePercentageChart = votePercentageChart; // the data this.electionWinners = electionWinners; // Initializes the svg elements required for this chart this.margin = {top: 10, right: 20, bottom: 30, left: 50}; let divyearChart = d3.select("#year-chart").classed("fullView", true); //fetch the svg bounds this.svgBounds = divyearChart.node().getBoundingClientRect(); this.svgWidth = this.svgBounds.width - this.margin.left - this.margin.right; this.svgHeight = 100; //add the svg to the div this.svg = divyearChart.append("svg") .attr("width", this.svgWidth) .attr("height", this.svgHeight); this.selected = null; } /** * Returns the class that needs to be assigned to an element. * * @param party an ID for the party that is being referred to. */ chooseClass (data) { if (data == "R") { return "yearChart republican"; } else if (data == "D") { return "yearChart democrat"; } else if (data == "I") { return "yearChart independent"; } } /** * Creates a chart with circles representing each election year, populates text content and other required elements for the Year Chart */ update () { //Domain definition for global color scale let domain = [-60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60]; //Color range for global color scale let range = ["#063e78", "#08519c", "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", "#fcbba1", "#fc9272", "#fb6a4a", "#de2d26", "#a50f15", "#860308"]; //ColorScale be used consistently by all the charts this.colorScale = d3.scaleQuantile() .domain(domain) .range(range); // ******* DONE: PART I ******* // Create the chart by adding circle elements representing each election year //The circles should be colored based on the winning party for that year //HINT: Use the .yearChart class to style your circle elements //HINT: Use the chooseClass method to choose the color corresponding to the winning party. //Append text information of each year right below the corresponding circle //HINT: Use .yeartext class to style your text elements //Style the chart by adding a dashed line that connects all these years. //HINT: Use .lineChart to style this dashed line //Clicking on any specific year should highlight that circle and update the rest of the visualizations //HINT: You can get the d3 selection that was clicked on using // d3.select(d3.event.target) //HINT: Use .highlighted class to style the highlighted circle //Election information corresponding to that year should be loaded and passed to // the update methods of other visualizations let yChart = this; var data = [[0, (this.svgHeight - 40)/2], [this.svgWidth, (this.svgHeight - 40)/2]]; let scaleX = d3.scaleLinear() .range([this.margin.left, this.svgWidth - this.margin.right]) .domain([0, this.electionWinners.length]); let line = d3.line(); let pathString = line(data); this.svg.append('g').append('path') .attr('d', pathString) .style("stroke-dasharray", ("2, 2")) .attr('stroke', 'black'); let years = this.svg.append('g').selectAll('g') .data(this.electionWinners) .enter() .append('g'); years.append('circle') .attr('cy', (this.svgHeight - 38) * .5) .attr('cx', (d, i) => {return scaleX(i)} ) .attr('r', 10) .attr('class', (d) => { return yChart.chooseClass(d.PARTY) }); //Append text information of each year right below the corresponding circle //HINT: Use .yeartext class to style your text elements years.append('text') .attr('x', (d, i) => {return scaleX(i)} ) .attr('y', (this.svgHeight - 20) * .5 + 30) .attr('yearText', true) .attr('text-anchor', 'middle') .text((d) => {return d.YEAR}); //Style the chart by adding a dashed line that connects all these years. //HINT: Use .lineChart to style this dashed line //Done. Before adding circles //Clicking on any specific year should highlight that circle and update the rest of the visualizations //HINT: Use .highlighted class to style the highlighted circle years.selectAll('circle') .on('mouseover', function (d) { d3.select(this).classed('highlighted', true); }) .on('mouseout', function (d) { years.selectAll('circle').classed('highlighted', false); }) .on('click', function (d) { years.selectAll('circle').classed('selected', false); d3.select(this).classed('selected', true); let file = 'data/Year_Timeline_' + d.YEAR + '.csv'; d3.csv(file, function (error, electionResult) { yChart.electoralVoteChart.update(electionResult, self.colorScale); yChart.votePercentageChart.update(electionResult); yChart.tileChart.update(electionResult, self.colorScale); }); }) //******* TODO: EXTRA CREDIT ******* //Implement brush on the year chart created above. //Implement a call back method to handle the brush end event. //Call the update method of shiftChart and pass the data corresponding to brush selection. //HINT: Use the .brush class to style the brush. } }