-
Notifications
You must be signed in to change notification settings - Fork 179
Drawing graphs
Important: The API for the visualization is in a very early stage and it is likely to change in future versions.
One of the main features of JSNetworkX is to easily draw graphs on a web page. In order to draw a graph, you need to include the latest version of the D3.js library.
Graphs are drawn using the force layout. Other layouts to choose from might be added in the future.
Once you have included D3, you can draw a graph with
jsnx.draw(G, options, bind)
The three arguments are:
-
G: The graph to draw -
options: An object with layout and style settings (see below) -
bind: A boolean, indicating whether changes to G (like adding, removing nodes) should be directly reflected in the visualization.
Have a look at how the examples are drawn. The "Getting Started" page also has a section about drawing.
The second argument is an object containing various settings for the visualization. Some of the are required, but most of them have sensible default values.
-
element(a DOM element) (required):
The container in which the graph should be drawn. AnSVGelement is append to this element. -
d3(D3 instance):
Use this option to pass a reference to the D3 library if the globald3global is not available or does not refer to D3. If this option is not present, it is assumed thatwindow.d3refers to D3. -
width(number or string):
The width of the resulting visualization. If not present, the width of the parent element (element) will be used. -
height(number or string):
The height of the resulting visualization. If not present, the width of the parent element (element) will be used. -
layout_attr(object):
Settings with which the force layout should be initialized. The possible options correspond to the respective method names, for examplelinkDistance,linkStrength, etc. For more information, please refer to the force layout documentation.
Sinceforce.links,force.nodesandforce.sizeare internally provided with values, these cannot be set externally.
The default value is:
'layout_attr': {
'charge': -120,
'linkDistance': 40
}
-
node_shape(string, default:circle): The element name of the node shape. -
node_attr(object): The attributes which should be added to each node element. Which attributes are supported and/or make sense depend on the element used for representing nodes (seenode_shape). The D3 method.attr()is called to set the attributes, so every value accepted by this method can be used.
The default value is:
'node_attr': {
'r': 10 // default element is circle, so the element will have a radius of 10
}
-
node_style(object):
The CSS style settings for each node. The D3 method.style()is called to set the attributes, so every value accepted by this method can be used.
The default value is:
'node_style': {
'stroke': '#333',
'fill': '#999',
'cursor': 'pointer'
}
-
edge_attr(object):
The attributes which should be added to each edge element. Edges are represented bypathelements. Thedattribute is automatically computed and should not be overridden. The D3 method.attr()is called to set the attributes, so every value accepted by this method can be used. -
edge_style(object):
The CSS style settings for each edge. The D3 method.style()is called to set the attributes, so every value accepted by this method can be used.
The default value is: 'edge_style': { 'stroke': '#000', 'stroke-width': 2 }
-
label_attrandedge_label_attr(object):
Attributes for thetextelements used to draw the labels. -
label_styleandedge_label_style(object):
The CSS style settings for each node and edge label. The default values are:'label_style': { 'text-anchor': 'middle', 'dominant-baseline': 'central', 'cursor': 'pointer', '-webkit-user-select': 'none', 'fill': '#000' } 'edge_label_style': { 'font-size': '0.8em', 'dominant-baseline': 'central', 'text-anchor': 'middle', '-webkit-user-select': 'none' } -
with_labels(boolean, default:false):
Iftrue, node labels are drawn. -
labels(string|function|object):
If this option is not set andwith_labelsistrue, the node itself is used as label.
If labels is a string, the label value is taken from each node data, with the key being the value of labels. I.e. G.node[n][labels].
If labels is a function, the label value is the return value of this function. The function is called for each node and is passed one argument. This argument is the same datum bound to each node element with D3.
If labels is an object, each node is looked up in the object and the value is taken as label, i.e. labels[node].
-
with_edge_labels(boolean, default: false):
Iftrue, edge labels are drawn. -
edge_labels(string|function):
If this option is not set andwith_labelsistrue, the label simply consist of both node names.
If edge_labels is a string, the label value is taken from each edge data, with the key being the value of edge_labels. I.e. G.get_edge_data(u,v)[edge_labels].
If labels is a function, the label value is the return value of this function. The function is called for each edge and is passed one argument. This argument is the same datum bound to each edge element with D3.
-
weighted(boolean, default: false):
Iftrue, the weight of each edge is considered when drawing the edge. Ifoptions.edge_labelsis not provided andoptions.with_edge_labelsistrue, the weights are used as edge labels. -
weighted_stroke(boolean, default: true):
Iftrue, the stroke width of each edge is relative to the weight of the edge. The maximum stroke width is the one defined inoptions.edge_style['stroke-width']. In that case this option must not be empty and must contain a number. -
weights(string|function, default:"weight"):
Ifweightsis a string, the weight is taken from each edge datum, with the key being the value ofweights. I.e.G.get_edge_data(u,v)[weights].
If weights is a function, the weight is the return value of this function. The function is called for each edge and is passed one argument. This argument is the same datum bound to each edge element with D3.
-
edge_offset(number|array|function, default:10):
This value defines the offset of the edge from the center of each node. This options is necessary to draw directed graphs properly. Otherwise, since the edge is normally drawn from the center of each node, the arrow heads won't be visible.
If the nodes are represented by circles, this value should be the same as the radius of the circles.
If edge_offset is a number, this number will be used for both, the x and y offset of the edge, from the center of the node.
If edge_offset is an array, it must be of the form [x,y], with x and y being numbers.
If edge_offset is a function, it must return an array of the form [x,y] (as above). The function is called for each edge and is passed one argument. This argument is the same datum bound to each edge element with D3.
-
pan_zoom(object, default:{enabled: true, scale: true}):
The value is an object with two properties,enabledandscale. Ifenabledistrue, the graph can be panned and zoomed in and out (through scrolling).
Ifscaleistrue, nodes will keep there size but the distance between nodes will increase/decrease. This mode turned out to be very useful to inspect dense graphs. If the shift key is pressed when zooming, a "normal" zoom is performed. Ifscaleisfalse, the action are reversed (i.e. pressing shift performs a scaled zoom).