Continuous Model Visualization

Visualization is often a very important section. The continuous model class allows for a lot of flexibility for what should be shown. In general, the usual functions like creatings trends, and normally plotting work in the same manner as for the CompositeModel. But more features have been added to also visualize the specified network and color the nodes using an internal state. The other states are shown beneath the network graph using histogram figures.

Example

This is an example generated visualization. It shows addiction as a node color, while the other states of the model are shown using histograms.

Continuous Visualization

Configuration

To configure and enable visualization, a configuration dictionary should be created first.

It should hold the following key -> value mappings:

Key (string) Value Type Default Mandatory Description
plot_interval number   True How many iterations should be between each plot
plot_variable string   True The state to use as node color
show_plot boolean True False Whether a plot should be shown
plot_output string   False Should be a path + file name, if set it will save a gif there
plot_title string Network simulation of plot_variable False The title of the visualization
plot_annotation string   False The annotation of the visualization
cmin number 0 False The minimum color to display in the colorbar
cmax number 0 False The maximum color to display in the colorbar
color_scale string RdBu False Matplotlib colorscale colors to use
layout string|function nx.drawing.spring_layout False Name of the networkx layout to use
layout_params dictionary   False Arguments to pass to layout function, takes argument name as key
variable_limits dictionary {state: [-1, 1] for state in states} False Dictionary mapping state name to a list with min and max value
animation_interval integer 30 False Amount of miliseconds between each frame

When the configuration dictionary has been initialized and the model has been initialized, it can be added to the model using the function configure_visualization(visualization_dictionary).

Note

By default, if the nodes in the networkx graph already have positions (the pos attribute is set per node), then the positions of the nodes will be used as a layout. If no positions are set, a spring layout will be used, or a specified layout will be used.

The layout key currently supports some igraph layouts as well, but it requires the igraph and pyintergraph libraries installed.

The following igraph layouts are supported:

  • fr: Creates an igraph layout using the fruchterman reingold algorithm

It is possible to include any function, that takes the graph as argument and returns a dictionary of positions keyed by node, just like how the networkx.drawing._layout functions work. This means all networkx layout functions can be included as layout value.

If you wish to pass any specific arguments to the function included as layout, this can be done using the layout_params key. Simply map it to a dict that has the parameter name as key and the desired value as value.

Example:

import networkx as nx
from ndlib.models.ContinuousModel import ContinuousModel

g = nx.erdos_renyi_graph(n=1000, p=0.1)

model = ContinuousModel(g)
model.add_status('status_1')

# Visualization config
visualization_config = {
    'plot_interval': 5,
    'plot_variable': 'status_1',
    'variable_limits': {
        'status_1': [0, 0.8]
    },
    'show_plot': True,
    'plot_output': './animations/model_animation.gif',
    'plot_title': 'Animated network',
}

model.configure_visualization(visualization_config)

After running the model using the iteration_bunch function, the returned value can then be used to call the visualize(iterations) function, which will produce the plot shown in animation above.

It is also possible to recreate the standard static plots using the plot(trends, len(iterations), delta=True) function. The first argument takes the trends created by the build_trends(iterations) function.