110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | id: 587d7fac367417b2b2512bdb | ||
|  | title: Set a Domain and a Range on a Scale | ||
|  | challengeType: 6 | ||
|  | forumTopicId: 301491 | ||
|  | dashedName: set-a-domain-and-a-range-on-a-scale | ||
|  | --- | ||
|  | 
 | ||
|  | # --description--
 | ||
|  | 
 | ||
|  | By default, scales use the identity relationship. This means the input value maps to the output value. However, scales can be much more flexible and interesting. | ||
|  | 
 | ||
|  | Say a dataset has values ranging from 50 to 480. This is the input information for a scale, also known as the <dfn>domain</dfn>. | ||
|  | 
 | ||
|  | You want to map those points along the `x` axis on the SVG canvas, between 10 units and 500 units. This is the output information, also known as the <dfn>range</dfn>. | ||
|  | 
 | ||
|  | The `domain()` and `range()` methods set these values for the scale. Both methods take an array of at least two elements as an argument. Here's an example: | ||
|  | 
 | ||
|  | ```js | ||
|  | // Set a domain | ||
|  | // The domain covers the set of input values | ||
|  | scale.domain([50, 480]); | ||
|  | // Set a range | ||
|  | // The range covers the set of output values | ||
|  | scale.range([10, 500]); | ||
|  | scale(50) // Returns 10 | ||
|  | scale(480) // Returns 500 | ||
|  | scale(325) // Returns 323.37 | ||
|  | scale(750) // Returns 807.67 | ||
|  | d3.scaleLinear() | ||
|  | ``` | ||
|  | 
 | ||
|  | Notice that the scale uses the linear relationship between the domain and range values to figure out what the output should be for a given number. The minimum value in the domain (50) maps to the minimum value (10) in the range. | ||
|  | 
 | ||
|  | # --instructions--
 | ||
|  | 
 | ||
|  | Create a scale and set its domain to `[250, 500]` and range to `[10, 150]`. | ||
|  | 
 | ||
|  | **Note**   | ||
|  | You can chain the `domain()` and `range()` methods onto the `scale` variable. | ||
|  | 
 | ||
|  | # --hints--
 | ||
|  | 
 | ||
|  | Your code should use the `domain()` method. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(code.match(/\.domain/g)); | ||
|  | ``` | ||
|  | 
 | ||
|  | The `domain()` of the scale should be set to `[250, 500]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(JSON.stringify(scale.domain()) == JSON.stringify([250, 500])); | ||
|  | ``` | ||
|  | 
 | ||
|  | Your code should use the `range()` method. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(code.match(/\.range/g)); | ||
|  | ``` | ||
|  | 
 | ||
|  | The `range()` of the scale should be set to `[10, 150]`. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert(JSON.stringify(scale.range()) == JSON.stringify([10, 150])); | ||
|  | ``` | ||
|  | 
 | ||
|  | The text in the `h2` should be -102. | ||
|  | 
 | ||
|  | ```js | ||
|  | assert($('h2').text() == '-102'); | ||
|  | ``` | ||
|  | 
 | ||
|  | # --seed--
 | ||
|  | 
 | ||
|  | ## --seed-contents--
 | ||
|  | 
 | ||
|  | ```html | ||
|  | <body> | ||
|  |   <script> | ||
|  |     // Add your code below this line | ||
|  |     const scale = d3.scaleLinear(); | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     // Add your code above this line | ||
|  |     const output = scale(50); | ||
|  |     d3.select("body") | ||
|  |       .append("h2") | ||
|  |       .text(output); | ||
|  |   </script> | ||
|  | </body> | ||
|  | ``` | ||
|  | 
 | ||
|  | # --solutions--
 | ||
|  | 
 | ||
|  | ```html | ||
|  | <body> | ||
|  |   <script> | ||
|  |     const scale = d3.scaleLinear(); | ||
|  |     scale.domain([250, 500]) | ||
|  |     scale.range([10, 150]) | ||
|  |     const output = scale(50); | ||
|  |     d3.select("body") | ||
|  |       .append("h2") | ||
|  |       .text(output); | ||
|  |   </script> | ||
|  | </body> | ||
|  | ``` |