Plotting models

Plotting functionality makes use of the Sugiyama layout from igraph which plots nodes to reflect their position in a causal ordering.

The plot method calls plot_model and passes provided arguments to it.

A basic plot:

model <- make_model("X -> Y")

model |> plot_model()
plot of chunk unnamed-chunk-2
plot of chunk unnamed-chunk-2

ggplot layers

The model that is produced is a ggplot object and additional layers can be added in the usual way.

model |>
  plot_model()  +
  annotate("text", x = c(1, -1) , y = c(1.5, 1.5), label = c("Some text", "Some more text")) +
  coord_flip()
plot of chunk unnamed-chunk-3
plot of chunk unnamed-chunk-3

Adding labels

Provide labels in the same order as model nodes.

model <- make_model("A -> B -> C <- A")


# Check node ordering
inspect(model, "nodes")
#> 
#> Nodes: 
#> A, B, C

# Provide labels
model |>
   plot_model(
     labels = c("This is A", "Here is B", "And C"),
     nodecol = "white", textcol = "black")
plot of chunk unnamed-chunk-4
plot of chunk unnamed-chunk-4

Controlling positions

You can manually set positions using the x_coord and y_coord arguments.

You can manually set positions using the x_coord and y_coord arguments.

model |>
  plot(x_coord = 0:2,  y_coord = c(0, 2, 1))
plot of chunk unnamed-chunk-5
plot of chunk unnamed-chunk-5

Controlling color

You can manually control node color and text color for all nodes together or separately.

model |>
  plot(x_coord = 0:2,  y_coord = c(0, 2, 1),
       nodecol = c("blue", "orange", "red"),
       textcol = c("white", "red", "blue"))
plot of chunk unnamed-chunk-6
plot of chunk unnamed-chunk-6

Models with unobserved confounding

Unobserved confounding is represented using dashed curves.

make_model('X -> K -> Y <- X; X <-> Y; K <-> Y') |>   plot()
plot of chunk unnamed-chunk-7
plot of chunk unnamed-chunk-7

More complex models

Effective node placement

make_model("I -> V -> G <- N; C -> I <- A -> G; G -> Z",
           add_causal_types = FALSE) |>
  plot()
plot of chunk unnamed-chunk-8
plot of chunk unnamed-chunk-8

Requires manual coordinates

This graph has bad node placement.

make_model("D <- A -> B -> C -> D -> E; B -> E",
           add_causal_types = FALSE) |>
  plot()
plot of chunk unnamed-chunk-9
plot of chunk unnamed-chunk-9

Better:

make_model("D <- A -> B -> C -> D -> E; B -> E",
           add_causal_types = FALSE) |>
  plot(x_coord = c(0, -.1, 0, .1, 0), y_coord = 5:1)
plot of chunk unnamed-chunk-10
plot of chunk unnamed-chunk-10