I am totally newbie in D3, so don’t expect me to share an advance tutorial for D3 XD I am still learning and this post would just be my another self-notes, wherever or whenever i need it :’)
This would be my first post about D3, and i just wanna share about what i think it’s important if you wanna start learning D3. Well, actually when i first try it, just look at the library, check the examples, download the code and try to run it inside my project. And it works fine. But, when i wanna go deeper about D3, like, you know, start to customize the view, i need to learn more about it and what i got first, i think about it’s Selection; I think it’s an important thing since to modify element, syling or adding event/action, i need to learn how i make selection to the element i want first.
Well, i’m not start by ‘how to make the chart/element’ bcz, as you know, i just download some chart already on github or bl.ocks.org/d3indepth XD sorry. But if you interested, you can visit this helpfull article right here : https://www.dashingd3js.com/
Okay, so we’ll start. I am already make the graph, like forced-directed graph, consist of nodes and links (the line to connect the nodes). And, i start to customize it. D3 selections allow DOM elements to be selected in order to do something with them, be it changing style, modifying their attributes, performing data-joins or inserting/removing elements. (http://d3indepth.com/selections/) – btw you should visit the site, it really helpful. In D3 we use SVG element.
Scalable Vector Graphics (SVG)
Scalable Vector Graphics (SVG) is a family of specifications for creating two-dimensional vector graphics. Vector graphics are not created out of pixels. Vector graphics are created with paths having a start and end point, as well as points, curves and angles in between. Since Vector Graphics are not created out of pixels, they can be scaled up to larger or smaller sizes without losing image quality.
SVG images and their behaviors are defined in XML text files. The XML text can be included in an HTML document. This text means that images can be created and edited in a text editor. Also, since the DOM includes XML as part of the DOM specification, we can use the DOM Tree to access and update the structure, content and style of SVG Images.
SVG comes with a basic set of shape elements:
- Rectangle
- Circle
- Ellipse
- Straight Line
- Polyline
- Polygon
Okay, i already make a force-directed-graph that looks like this :
Okay, it’s only circles (nodes) and links btw. But if you learn D3, you will need to check the element inspector ( i prefer use chrome). Why? Because it will help us to make selection. As you see on D3, we just write code like this :
var svg = d3.select("svg"),
width = +svg.attr("width"), height = +svg.attr("height");
var node = g.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(nodes_data)
.enter()
.append("circle")
.attr("r", radius)
.attr("fill", circleColour);
and the result is as you can see above ( on the picture), but then we check inspector, and we got like this :
You can see the <g> tag , it is the SVG Group Element is a container that contains all child SVG elements defined inside of it and that share the same attribute. In the example, it have 2 groups. One contains lines and the others contain circles. And there’s many circle elements that created with D3, we use .append("circle")
and its populate the element as we can see in the element inspector.
D3 has two functions to make selections d3.select
and d3.selectAll
.
d3.select
selects the first matching element whilst d3.selectAll
selects all matching elements. Each function takes a single argument which specifies the selector string. Examples, we want to select all the circles, we can use d3.selectAll(“circle”); And when we use d3.select(“circle”); it will select the first matching element, only one, the first one. In my example, it is the line that i blocked. We can also select item by it class like d3.selectAll(“.classname”);
We can also updating the elements with functions, like this :
d3.selectAll('circle')
.attr('cx', function(d, i) {
return i * 100;
});
The function typically accepts two arguments d
and i
. The first argument d
is the joined data and i
is the index of the element within the selection. If we want to update elements in a selection according to their position within the selection, we can use the i
argument. For example to position some rect
elements horizontally we can use: (http://d3indepth.com/selections/)
When i added events, i add a function and i want to change radius of the element i clicked (for example) i can use “this“, so it will look like :
d3.select(this)
; and i can also modify element, like d3.select(this).attr('radius', 10)
;
We can also make selection like this:
// Add .selected class to 3rd circle
d3.select('circle:nth-child(3)')
.classed('selected', true);
// Set checked property of checkbox
d3.select('input.robot-checkbox')
.property('checked', true);
So it will just modify the element clicked, and change radius to 10. You can also adding text, title, or changing the color, add borders etc, but i will write more about modifying element and styling on my next post ! See youu very sooon 🙂