# ControlPlots

## Introduction

This package provides the following features:

- simple plots can be created with the
`plot()`

function - an oscilloscope-like plot with multiple channels can be created
with the
`plotx()`

function - an XY plot can be created with the
`plotxy()`

function - pan and zoom are supported
- LaTeX can be used for the labels
- the parameters of the plot commands are stored in a struct and returned
- this struct can be displayed again or stored in a file and loaded, the labels etc can be edited and a new plot can be displayed or exported

## Planned features

## TODO

- add support for PythonPlot
- allow changing of the caption
- the
`save()`

function should allow storing a plot as jld2, pdf or png file - add bode plots

The goal of this package is to provide simple plots for control system developers and students.

## Installation

## Installation on Linux

### On Linux

First, install matplotlib:

```
sudo apt install python3-matplotlib
```

If not done yet, create a project:

```
mkdir MyProject
cd MyProject
julia --project="."
```

and install `ControlPlots`

using Pkg
pkg"add ControlPlots"

## Installation on Windows

### On Windows

If not done yet, create a project:

```
mkdir MyProject
cd MyProject
julia --project="."
```

Install Python, matplotlib and ControlPlots

```
using Pkg
ENV["PYTHON"]=""
pkg"add ControlPlots"
```

## Usage

### Basic example

Launch Julia with `julia --project`

. Then execute:

using ControlPlots, LaTeXStrings
X = 0:0.1:2pi
Y = sin.(X)
p = plot(X, Y, xlabel=L"\alpha = [0..2\pi]", ylabel="sin", fig="basic")

A plot window like this should pop up:

The package `LaTeXStrings`

is only required if you want to use LaTeX for any of your labels like in the example above. You need to prefix LaTeX strings with the letter `L`

.

You can now close the plot window. You can re-display the plot by typing:

```
p
```

You can also save the plot under a name of your choice:

save("plot.jld2", p)

Now you restart Julia and load it with:

using ControlPlots
p = load("plot.jld2")

The plot is automatically displayed.

### Multi-channel plot

using ControlPlots
T = 0:0.1:2pi
Y1 = sin.(T)
Y2 = cos.(T)
p = plotx(T, Y1, Y2; ylabels=["Y1", "Y2"], fig="dual")

The optional parameter `ysize` can be used to change the size of the y-axis labels. The default value is 14 points.
### XY-Plot

using ControlPlots
T = 0:0.05:2pi+0.1
X = sin.(T)
Y = cos.(3T)
p = plotxy(X, Y, xlabel="X", ylabel="Y", fig="xy")

### n-in-one Plot

You can plot multiple time series in one plot, e.g. like this:

using ControlPlots
x = 1.5*ones(11)
y = 1:0.1:2
out = min.(x, y)
plot(1:11, [x, y, out]; labels=["input_a", "input_b", "output"],
fig="2-in-one")

### Dual y-axis

using ControlPlots
T = 0:0.05:2pi+0.1
POS_Z = sin.(T)
VEL_Z = 5*cos.(T)
plot(T, POS_Z, VEL_Z; xlabel="time [s]",
ylabels=["pos_z [m]", "vel_z [m/s]"],
labels=["pos_z", "vel_z"], fig="dual_y-axis")

### 2D video

A video-like display of a particle system (points, connected by lines) can be created with the
function `plot2d`

. Example:

using ControlPlots
t = 0
x0 = 2.0
z0 = 0.0
for t in 0:0.1:5
global x0, z0
plot2d([[1,0,0], [x0,0,z0]], t; segments=1)
x0 += 0.1; z0 += 0.1
sleep(0.1)
end

When the function is called at t=0 the line, dot and text objects are created. Each time afterwords these objects are just moved/ updated. Therefore, the update is very fast and you can achieve a high frame rate. With 10 points you can achieve a framerate of 20 Hz or more, depending on the speed of your hardware.

### Advanced usage

This library uses Matplotlib as backend, and you can change all settings of rcParams as you wish. Example: Using an already installed LaTeX installation for high-quality rendering of LaTeX labels and other text:

#### More beautiful LaTeX

rcParams = plt.PyDict(plt.matplotlib."rcParams")
rcParams["text.usetex"] = true

Just add this at the beginning of your script. You can change fonts, font sizes, colors etc.

#### More beautiful GUI

If you add the following line to your `.bashrc`

file or to the script you use to start Julia:

```
export MPLBACKEND=qt5agg
```

you get a more beautiful GUI. This does not work on every PC, therefore it is not the default.