# Plotting dataΒΆ

Often we want to plot loss or accuracy of a network training over time to get an impression of convergence speed. nuts-ml provides a simple plotting nut to facilitate this need. The following example demonstrates the basic usage by plotting a quadratic function

```  >>> samples = (x**2 for x in range(100))
>>> samples >> PlotLines(None) >> Consume()

.. image:: pics/plot_squares.png
```

Note that the plot updates live with each sample read from `samples` and closes immediately once the plotting is finished. Since the samples are just numbers we specify `None` as column index in `PlotLines`.

`PlotLines` allows to plot multiple sample columns. In this next example we plot ``2*x` and `x**2` and specify the corresponding sample columns `(0,1)` in `PlotLines`:

```>>> samples = ((2*x, x**2) for x in range(100))
>>> samples >> PlotLines((0,1), layout=(2,1), titles=('2x','x**2')) >> Consume()
```

We want the two plots of the figure to appear in one column (instead of next to each other) and therefore set the `layout` to 2 rows and 1 column. `titles` allows to set titles for the individual plots.

Let us conclude this section with a more complex example. The following code sketch plots the loss and accuracy of a network training per batch and per epoch. The generated figures are written to image files in PNG format instead of being displayed:

```plot_batch = PlotLines((0,1), every_sec=5, filepath='batch.png')
plot_epoch = PlotLines((1,2), 0, layout=(2,1), filepath='epoch.png')
mean = Mean()

for epoch in range(EPOCHS):
t_loss, t_acc = (train_samples >> ... >> build_batch >>
network.train() >> plot_batch >> Unzip())
plot_epoch( (epoch, mean(t_loss), mean(t_acc) )
```

For a large train set many batches will be created and losses computed. We are only interested in a subset of those and set `every_sec=5` to plot batch-wise loss and accuracy every 5 seconds. Alternatively we could specify `every_n=10` to plot for every 10-th batch.

When plotting the mean loss and average per epoch via `plot_epoch` we provide a tuple of format `(<epoch>, <mean loss>, <mean acc>)`. We want the x-axis to show the epoch and the y-axes to show loss and accuracy. The column indices specified in `PlotLines` for the y-axes are therefore `(1,2)` and the values for the x-axis are in column 0 of the samples. Run `help(PlotLines)` for more details and the description of other parameters.