One of the first questions you may ask yourself when getting introduced in D3 is: why are we using selectAll(‘html-tag-name’) method if there is no item to select of that type?
First, let’s see an example of the situation we are talking about:
<body> <script> const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9]; // Add your code below this line d3.select('body') .selectAll('h2') .data(dataset) .enter() .append('h2') .text('New Title') // Add your code above this line </script> </body>
In the previous example, the only existing HTML tag is <body> . We select body (d3.select(‘body’) ) and then we perform the .selectAll(‘h2’) . On its own, it makes no sense as the method won’t return any value since no <h2> tag exists. Nevertheless, it will make sense if we keep looking at the following code.
After the select .selectAll(‘h2’) we attach the existing dataset to the selected items (.data(dataset) ). Then, we use the enter() method, which gives meaning to the previous .selectAll(‘h2’) . When using enter() , D3 looks for the number of selected items to bind them with the data. In case of having not enough items in the selection, the enter() method will create them.
Therefore, as .selectAll(‘h2’) was empty and the dataset variable contains 9 elements, it will iterate the code 9 times. In case of having already created some <h2> elements, it will simply fulfill the HTML code the necessary iteration to cover all the dataset elements. Remember that who does this iteration is the data() method. It parses the data set, and any method that’s chained after data() is run once for each item in the data set.
You can find more information in the official documentation at the D3js.org website.
In D3 there exists the Scale function to change the value of the data set so that it can fit in the screen. Two important methods are range() and domain(). The domain method covers the set of input values whereas the range function convers the set of output values. Let’s see an example:
const scale = d3.scaleLinear(); scale.domain([50, 480]); scale.range([10, 500]); scale(50) // Returns 10 scale(480) // Returns 500 scale(325) // Returns 323.37 scale(750) // Returns 807.67
The domain() method passes information to the scale about the raw data values for the plot. The range() method gives it information about the actual space on the web page for the visualization.