Drawing Graphs
Graphs can be visualized by using either GraphPlot
or rendering to .dot files (which can be viewed using xdot).
GraphPlot
GraphPlot
plotting is available if GraphPlot
is imported before DFG is imported. Install GraphPlot
using the following command:
using Pkg
Pkg.add("GraphPlot")
Then bring GraphPlot
in before DFG:
using GraphPlot
using DistributedFactorGraphs
Any factor graph can then be drawn by calling plotDFG
:
using Cairo # hide
# Construct graph using IIF
using IncrementalInference
# Create graph
dfg = GraphsDFG{SolverParams}(solverParams=SolverParams())
v1 = addVariable!(dfg, :x0, ContinuousScalar, tags = [:POSE], solvable=1)
v2 = addVariable!(dfg, :x1, ContinuousScalar, tags = [:POSE], solvable=1)
v3 = addVariable!(dfg, :l0, ContinuousScalar, tags = [:LANDMARK], solvable=1)
prior = addFactor!(dfg, [:x0], Prior(Normal(0,1)))
f1 = addFactor!(dfg, [:x0; :x1], LinearRelative(Normal(50.0,2.0)), solvable=1)
f1 = addFactor!(dfg, [:l0; :x0], LinearRelative(Normal(40.0,5.0)), solvable=1)
f1 = addFactor!(dfg, [:l0; :x1], LinearRelative(Normal(-10.0,5.0)), solvable=1)
# Plot graph
plotDFG(dfg)
Rendering GraphPlot to PDF
The graph can be rendered to PDF, SVG or JPG in the following way by including compose:
using Compose
# lets add another variable and factor and plot it
dfg.solverParams.graphinit = false # hide
addVariable!(dfg, :x2, ContinuousScalar);
addFactor!(dfg, [:x1; :x2], LinearRelative(Normal(50.0,2.0)));
# Save to SVG
draw(SVG("graph.svg", 10cm, 10cm), plotDFG(dfg));
nothing # hide
FIXME show graph.svg
More Information
More information at GraphPlot.jl
Dot Files
Dot files are a standard format for visualizing graphs and applications such as xdot are available to view the files. Dot plotting does not require GraphPlot
and can be drawn by either:
- Calling
toDot
on any graph to produce a string of the graph - Calling
toDotFile
on any graph to save it directly to a dotfile
using DistributedFactorGraphs
# Construct graph using IIF
using IncrementalInference
# Create graph
dfg = GraphsDFG{SolverParams}(solverParams=SolverParams())
v1 = addVariable!(dfg, :x0, ContinuousScalar, tags = [:POSE], solvable=1)
v2 = addVariable!(dfg, :x1, ContinuousScalar, tags = [:POSE], solvable=1)
v3 = addVariable!(dfg, :l0, ContinuousScalar, tags = [:LANDMARK], solvable=1)
prior = addFactor!(dfg, [:x0], Prior(Normal(0,1)))
f1 = addFactor!(dfg, [:x0; :x1], LinearRelative(Normal(50.0,2.0)), solvable=1)
f1 = addFactor!(dfg, [:l0; :x0], LinearRelative(Normal(40.0,5.0)), solvable=1)
f1 = addFactor!(dfg, [:l0; :x1], LinearRelative(Normal(-10.0,5.0)), solvable=1)
# Save to dot file
toDotFile(dfg, "/tmp/test.dot")
# Open with xdot
# run(`xdot /tmp/test.dot`)
# nothing # hide