192 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 5d8a4cfbe6b6180ed9a1ca09
 | |
| title: Part 44
 | |
| challengeType: 0
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| The line needs x and y values for each point of data. Chain `x` to the line and pass it a "d function". Here's how that will look:
 | |
| 
 | |
| ```js
 | |
| .x(d => d.year)
 | |
| ```
 | |
| 
 | |
| You will be passing your `data` array to this line function, where it will go through each item in the array(`d`) and create an x value based on the year(`d.year`).
 | |
| 
 | |
| This is the first place you have seen a "d function". These are common in D3 and that is how I will refer to them throughout this project.
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| test-text
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   /const twitterLine = d3\.line\(\)\s*\.x\s*\(\s*d\s*=>\s*d\.year\s*\)/g.test(
 | |
|     code
 | |
|   )
 | |
| );
 | |
| ```
 | |
| 
 | |
| # --seed--
 | |
| 
 | |
| ## --before-user-code--
 | |
| 
 | |
| ```html
 | |
| <!DOCTYPE html>
 | |
| <html>
 | |
|   <head>
 | |
|     <title>D3 Dashboard</title>
 | |
|     <style>
 | |
|       body {
 | |
|         background-color: #ccc;
 | |
|         padding: 100px 10px;
 | |
|       }
 | |
| 
 | |
|       .dashboard {
 | |
|         width: 980px;
 | |
|         height: 500px;
 | |
|         background-color: white;
 | |
|         box-shadow: 5px 5px 5px 5px #888;
 | |
|         margin: auto;
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|       }
 | |
|     </style>
 | |
|   </head>
 | |
| 
 | |
|   <body>
 | |
|     <div class="dashboard"></div>
 | |
|   </body>
 | |
| </html>
 | |
| ```
 | |
| 
 | |
| ## --seed-contents--
 | |
| 
 | |
| ```html
 | |
| <script>
 | |
|   const data = [ 
 | |
|     { year: 2012, followers: { twitter: 2594, tumblr:  401, instagram:   83 }},
 | |
|     { year: 2013, followers: { twitter: 3049, tumblr:  440, instagram:  192 }},
 | |
|     { year: 2014, followers: { twitter: 3511, tumblr:  415, instagram:  511 }},
 | |
|     { year: 2015, followers: { twitter: 3619, tumblr:  492, instagram: 1014 }},
 | |
|     { year: 2016, followers: { twitter: 4046, tumblr:  543, instagram: 2066 }},
 | |
|     { year: 2017, followers: { twitter: 3991, tumblr:  701, instagram: 3032 }},
 | |
|     { year: 2018, followers: { twitter: 3512, tumblr: 1522, instagram: 4512 }},
 | |
|     { year: 2019, followers: { twitter: 3274, tumblr: 1989, instagram: 4715 }},
 | |
|     { year: 2020, followers: { twitter: 2845, tumblr: 2040, instagram: 4801 }}
 | |
|   ];
 | |
| </script>
 | |
| <script>
 | |
|   const svgMargin = 70,
 | |
|     svgWidth = 700,
 | |
|     svgHeight = 500,
 | |
|     twitterColor = '#7cd9d1',
 | |
|     tumblrColor = '#f6dd71',
 | |
|     instagramColor = '#fd9b98';
 | |
| 
 | |
|   const lineGraph = d3.select('.dashboard')
 | |
|     .append('svg')
 | |
|     .attr('width', svgWidth)
 | |
|     .attr('height', svgHeight);
 | |
| 
 | |
|   const yScale = d3.scaleLinear()
 | |
|     .domain([0, 5000])
 | |
|     .range([svgHeight - svgMargin, svgMargin]);
 | |
| 
 | |
|   const xScale = d3.scaleLinear()
 | |
|     .domain([2012, 2020])
 | |
|     .range([svgMargin, svgWidth - svgMargin]);
 | |
| 
 | |
|   const yAxis = d3.axisLeft(yScale)
 | |
|     .ticks(6, '~s');
 | |
| 
 | |
|   const xAxis = d3.axisBottom(xScale)
 | |
|     .tickFormat(d3.format(''))
 | |
|     .tickPadding(10);
 | |
| 
 | |
|   lineGraph.append('g')
 | |
|     .call(yAxis)
 | |
|     .attr('transform', `translate(${svgMargin}, 0)`)
 | |
|     .style('font', '10px verdana');
 | |
| 
 | |
|   lineGraph.append('g')
 | |
|     .call(xAxis)
 | |
|     .attr('transform', `translate(0, ${svgHeight - svgMargin})`)
 | |
|     .selectAll('text')
 | |
|     .style('transform', 'translate(-12px, 0) rotate(-50deg)')
 | |
|     .style('text-anchor', 'end')
 | |
|     .style('cursor', 'pointer')
 | |
|     .style('font', '10px verdana');
 | |
| 
 | |
|   const twitterLine = d3.line()
 | |
| 
 | |
| 
 | |
| </script>
 | |
| ```
 | |
| 
 | |
| # --solutions--
 | |
| 
 | |
| ```html
 | |
| <script>
 | |
|   const data = [ 
 | |
|     { year: 2012, followers: { twitter: 2594, tumblr:  401, instagram:   83 }},
 | |
|     { year: 2013, followers: { twitter: 3049, tumblr:  440, instagram:  192 }},
 | |
|     { year: 2014, followers: { twitter: 3511, tumblr:  415, instagram:  511 }},
 | |
|     { year: 2015, followers: { twitter: 3619, tumblr:  492, instagram: 1014 }},
 | |
|     { year: 2016, followers: { twitter: 4046, tumblr:  543, instagram: 2066 }},
 | |
|     { year: 2017, followers: { twitter: 3991, tumblr:  701, instagram: 3032 }},
 | |
|     { year: 2018, followers: { twitter: 3512, tumblr: 1522, instagram: 4512 }},
 | |
|     { year: 2019, followers: { twitter: 3274, tumblr: 1989, instagram: 4715 }},
 | |
|     { year: 2020, followers: { twitter: 2845, tumblr: 2040, instagram: 4801 }}
 | |
|   ];
 | |
| </script>
 | |
| <script>
 | |
|   const svgMargin = 70,
 | |
|     svgWidth = 700,
 | |
|     svgHeight = 500,
 | |
|     twitterColor = '#7cd9d1',
 | |
|     tumblrColor = '#f6dd71',
 | |
|     instagramColor = '#fd9b98';
 | |
| 
 | |
|   const lineGraph = d3.select('.dashboard')
 | |
|     .append('svg')
 | |
|     .attr('width', svgWidth)
 | |
|     .attr('height', svgHeight);
 | |
| 
 | |
|   const yScale = d3.scaleLinear()
 | |
|     .domain([0, 5000])
 | |
|     .range([svgHeight - svgMargin, svgMargin]);
 | |
| 
 | |
|   const xScale = d3.scaleLinear()
 | |
|     .domain([2012, 2020])
 | |
|     .range([svgMargin, svgWidth - svgMargin]);
 | |
| 
 | |
|   const yAxis = d3.axisLeft(yScale)
 | |
|     .ticks(6, '~s');
 | |
| 
 | |
|   const xAxis = d3.axisBottom(xScale)
 | |
|     .tickFormat(d3.format(''))
 | |
|     .tickPadding(10);
 | |
| 
 | |
|   lineGraph.append('g')
 | |
|     .call(yAxis)
 | |
|     .attr('transform', `translate(${svgMargin}, 0)`)
 | |
|     .style('font', '10px verdana');
 | |
| 
 | |
|   lineGraph.append('g')
 | |
|     .call(xAxis)
 | |
|     .attr('transform', `translate(0, ${svgHeight - svgMargin})`)
 | |
|     .selectAll('text')
 | |
|     .style('transform', 'translate(-12px, 0) rotate(-50deg)')
 | |
|     .style('text-anchor', 'end')
 | |
|     .style('cursor', 'pointer')
 | |
|     .style('font', '10px verdana');
 | |
| 
 | |
|   const twitterLine = d3.line()
 | |
|     .x(d => d.year)
 | |
| 
 | |
| 
 | |
| </script>
 | |
| ```
 |