---
title: "Plotting models"
output: 
  rmarkdown::html_vignette:
    md_extensions: [ 
      "-autolink_bare_uris" 
    ]
vignette: >
  %\VignetteIndexEntry{Plotting models}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  echo = TRUE,
  comment = "#>"
)

```

```{r setup, message = FALSE, warning = FALSE, echo = FALSE}
library(dplyr)
library(CausalQueries)
library(knitr)
library(ggplot2)

```


Plotting functionality uses `plot_model` 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:

```{r}
model <- make_model("X -> Y")

model |> plot_model()
```

## ggplot layers

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

```{r}
model |> 
  plot_model()  + 
  annotate("text", x = c(1, -1) , y = c(1.5, 1.5), label = c("Some text", "Some more text")) + 
  coord_flip()
```


## Adding labels

Provide labels in the same order as model nodes. 

```{r}
model <- make_model("A -> B -> C <- A") 


# Check node ordering
inspect(model, "nodes")

# Provide labels
model |>
   plot_model(
     labels = c("This is A", "Here is B", "And C"),
     nodecol = "white", textcol = "black")
```

## 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.

```{r} 
model |> 
  plot(x_coord = 0:2,  y_coord = c(0, 2, 1))
```


## Controlling  color

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

```{r} 
model |> 
  plot(x_coord = 0:2,  y_coord = c(0, 2, 1), 
       nodecol = c("blue", "orange", "red"),
       textcol = c("white", "red", "blue"))
```

# Models with unobserved confounding

Unobserved confounding is represented using dashed curves.


```{r}
make_model('X -> K -> Y <- X; X <-> Y; K <-> Y') |>   plot()
```

# More complex models

## Effective node placement

```{r}
make_model("I -> V -> G <- N; C -> I <- A -> G; G -> Z",
           add_causal_types = FALSE) |> 
  plot() 
```


## Requires manual coordinates

This graph has bad node placement.

```{r}
make_model("D <- A -> B -> C -> D -> E; B -> E",
           add_causal_types = FALSE) |> 
  plot() 
```

Better:

```{r}
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) 

```



