Node Data
The original node
object only requires an id
property so d3 can identify the node. Graphly D3 extends this data structure quite a bit to provide additional properties to describe appearance and behavior of any node.
INFO
Using Graphly D3, nodes are rendered using a shape template. More about defining them on the Template API documenation.
Example
A simple example for a node object with most possible properties. Check the sub-sections for more details.
const node = {
id: "node1",
x: 150,
y: -30,
shape: {
type: "myShape",
scale: 1,
},
gravity: -5000,
spawn: {
source: "node2",
angle: 45,
distance: 600,
},
anchor: {
type: "soft",
x: 300,
y: 100,
},
satellite: {
source: "node2",
angle: 45,
distance: 600,
},
payload: {
// put your custom data here
},
};
Interface
interface Node {
id: string;
x?: number;
y?: number;
shape: Shape;
gravity?: number;
spawn?: Spawn;
anchor?: Anchor;
satellite?: Satellite;
payload?: any;
}
Id & Position
The node id
property is a string to uniquely identify a node in the graph.
The node x
and y
properties are optional and define the position of the node. If not defined the simulation will place them at 0,0
by default except spawn, anchor or satellite properties are set.
INFO
Those is the only property by the vanilla d3 force-simulation data structure.
const node = {
id: "node1",
x: 150,
y: -30,
};
Shape
The node shape
object property defines the appearance of the node. It requires a type
and a scale
property to tell Graphly D3 how to render the node.
interface Shape {
type: string;
scale: number;
url?: string;
bodyResolution?: number;
}
Property | Description |
---|---|
type | defines which template to use to render the node (Template API) |
scale | defines the relative scale of the node (1 by default) |
url? | can be used to define a custom remote origin for this specific shape type |
bodyResolution? | can be used to define the resolution of the gly-body path and how detailed collisions and link distances can be calculated (default is 32 ) |
WARNING
bodyResolution is only available since version 1.1.0
TIP
You can use the scale
property to create a visual hierachy of nodes by decreasing the size of less important nodes.
const node = {
id: "node1",
shape: {
type: "myShape",
scale: 1,
},
};
Gravity
The node gravity
property is optional and defines the gravitational force this node applies to other nodes. If not set the envGravity
of the force simulation is used.
TIP
This proeprty is handy to fine-tune the forces within the simulation. Otherwise, the default value will suffice and you can just ignore it.
In most cases you want to use a negative value to make the nodes push away from each other since this counteracts the link pulling forces.
const node = {
id: "node1",
gravity: -5000,
};
Spawn
The node spawn
object property is optional and describes how the node should be placed when it is created the first time. This property is used when no position are defined yet and the node should be spawned in relative position to another node.
interface Spawn {
source: string;
angle: number;
distance: number;
}
Property | Description |
---|---|
source | id of the source node to spawn the new node in relative position to |
angle | angle in degrees. Rotation is clockwise. 0 is above the source node |
distance | distance between the centers of the source node and the new node |
INFO
This property only gets applied on render()
when the node object does not have x
, y
or fx
, fy
properties set.
const node = {
id: "node1",
spawn: {
source: "node2",
angle: 45,
distance: 600,
},
};
Anchor
The node anchor
object property is optional and describes the position to which the node is constantly heading towards.
enum AnchorType {
Soft = "soft",
Hard = "hard",
}
interface Anchor {
type: AnchorType;
x: number;
y: number;
}
Property | Description |
---|---|
type | defines whether the node moves softly towards the position or is locked to it |
x | the x position of the anchor |
y | the y position of the anchor |
INFO
soft
anchors are only heading towards the anchor position and will be affected by the other forces applied to the node.
hard
anchors are fixing the node to the anchor position and will not be affected by any other forces. (This will set fx
and fy
properties on the node object)
const node = {
id: "node1",
anchor: {
type: "soft",
x: 300,
y: 100,
},
};
import { AnchorType } from "@livereader/graphly-d3";
const node = {
id: "node1",
anchor: {
type: AnchorType.Soft,
x: 300,
y: 100,
},
};
Satellite
The node satellite
object property is optional and can be used to bind one node to another. It will keep a relative position to the source node at all times.
enum SatelliteType {
Soft = "soft",
Hard = "hard",
}
interface Satellite {
source: string;
angle: number;
distance: number;
type?: SatelliteType;
}
Property | Description |
---|---|
source | id of the source node to spawn the new node in relative position to |
angle | angle in degrees. Rotation is clockwise. 0 is above the source node |
distance | distance between the centers of the source node and the new node |
type? | defines whether the node moves softly towards the position or is locked to it. soft by default |
WARNING
type is only available since version 1.4.0
INFO
By default the satellite nodes will be of type
soft
and therefore affected by the other forces like (e.g. gravity or collision) but strive towards the computed position simmilar to a soft anchor
.
In case of multiple satellites with a similar target position, the satellites will all strive towards their target position and collide with each other.
Using type
hard
will fix the node to the computed relative position and will not be affected by any other forces. Multiple satellites with type
hard
will not collide with each other either.
const node = {
id: "node1",
satellite: {
source: "node2",
angle: 45,
distance: 600,
type: "soft",
},
};
Payload
Put all your custom data behind the payload
object property and use this data in a template to render the node in the desired way.
INFO
To encapsulate and efficiently monitor data changes to perform the necessary re-rendering of nodes, the node payload
is optional.
const node = {
payload: {
// put your custom data here
},
};
Playground
Give it a try and see how the different properties influence the appearance and behavior of nodes.
WARNING
Dont change the nodes
array name since the playground context depends on it.
INFO
This template uses data about title
and color
to render the node.
payload: {
title: "Hello\nWorld",
color: "teal",
}