# Summary

## Recommendations for longer notebooks

### Create a table of contents on top

You can do that using Markdown. This produces a nice overview for longer notebooks. Example: https://stackoverflow.com/a/39817243

### Jupyter Book

You can cite and cross-reference

You can toggle cell visibility

… and a lot more

## Discussion points

Use cases and reproducibility

If you are already using Jupyter, what tasks do you use it for?

If you are new to Jupyter, do you see any possible use cases?

Do you think Jupyter Notebooks can help tackle the problem of irreproducible results?

Are Jupyter notebooks “workflows”?

A reproducible workflow documents a “pipeline”

Also a Jupyter notebook can be a data processing and visualization pipeline

Are Jupyter notebooks “workflows”?

## Interesting blog posts and articles

## Similar tools for other languages

R: R Shiny, R Markdown

JavaScript: Observable

Julia: Pluto

## Avoiding repetitive code

**It all started with a short and simple notebook** but how to organize as projects and
notebooks grow?

Let’s imagine we wrote this function `fancy_plot`

for a hexagonal 2D histogram plot
(please try it in your notebook):

```
import seaborn as sns
# to get some random numbers
from numpy.random import default_rng
# this one is simple but let us imagine something very lengthy
def fancy_plot(x_values, y_values, color):
"""
Fancy function creating fancy plots.
"""
sns.jointplot(x=x_values, y=y_values, kind="hex", color=color)
rng = default_rng()
x_values = rng.standard_normal(500)
y_values = rng.standard_normal(500)
# call our function
fancy_plot(x_values, y_values, "#4cb391")
other_x_values = rng.standard_normal(500)
other_y_values = rng.standard_normal(500)
# call our function again, this time with other data
fancy_plot(other_x_values, other_y_values, "#fc9272")
```

Now we would like to use this function in 5 other notebooks without duplicating it over all of the notebooks (imagine the function is very lengthy).

It can be useful to create a Python file `myplotfunctions.py`

in the same
folder as the notebooks (you can change the name)
and place this code into `myplotfunctions.py`

:

```
import seaborn as sns
# this one is simple but let us imagine something very lengthy
def fancy_plot(x_values, y_values, color):
"""
Fancy function creating fancy plots.
"""
sns.jointplot(x=x_values, y=y_values, kind="hex", color=color)
```

Now we can simplify our notebook:

```
# to get some random numbers
from numpy.random import default_rng
from myplotfunctions import fancy_plot
rng = default_rng()
x_values = rng.standard_normal(500)
y_values = rng.standard_normal(500)
# call our function
fancy_plot(x_values, y_values, "#4cb391")
other_x_values = rng.standard_normal(500)
other_y_values = rng.standard_normal(500)
# call our function again, this time with other data
fancy_plot(other_x_values, other_y_values, "#fc9272")
```