matplotlib-backend-terminal 0.1.0
show matplotlib plots directly in ipython in your terminal

# matplotlib-backend-terminal

This python module allows you to use your terminal to show inline plots generated by python's [matplotlib](https://github.com/matplotlib/matplotlib) using the [chafa](https://hpjansson.org/chafa/) image viewer.

The module is a modified version of the [kitty backend](https://github.com/jktr/matplotlib-backend-kitty) and is also based on this [sixel backend](https://github.com/jonathf/matplotlib-terminal).

You will need a terminal that has support for displaying graphics and [chafa](https://hpjansson.org/chafa/download) installed. 

To install either run

 - `$ pip install --user matplotlib-backend-terminal`

or clone this repo and run
 - `$ cd matplotlib-backend-terminal && pip install . `

Configure matplotlib to use the module by either setting the
environment variable `MPLBACKEND` to `module://matplotlib-backend-terminal`
or by initializing matplotlib as follows.

```python
import matplotlib
matplotlib.use('module://matplotlib-backend-terminal')
import matplotlib.pyplot as plt
```

Any flags required by `chafa` can be passed to the backend by setting the `MPLBACKEND_CHAFA_OPTS` environment variable. For example, to use the `--passthrough tmux` flag, you can run

```
$ export MPLBACKEND_CHAFA_OPTS="--passthrough tmux"
```

See the [chafa documentation](https://hpjansson.org/chafa/man/) for more information on available flags and options. Once `chafa` works in your terminal setup it should work with this backend.

To enable transparency in the terminal, you can set the `MPLBACKEND_TRANSPARENT` environment variable to 1. This will make the background of the plot transparent, allowing the terminal background to show through. Note that this will not work with all output formats.


If you've installed this module correctly, you can now use
the following sample code to draw a plot in your terminal.

```
import matplotlib
matplotlib.use('module://matplotlib-backend-terminal')
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")
t = np.linspace(0,5,200)
plt.fill_between(t,np.sin(t),np.cos(2*t),alpha=0.5)
plt.fill_between(t,np.cos(t),np.sin(2*t),alpha=0.5)
plt.show()

<plot is shown>
```
Example output using Ghostty terminal.

![Example output](resources/demo.png)

If you set your matplotlib to interactive mode via
`matplotlib.pyplot.ion()` or by running python as
`python -i`, non-empty figures are drawn on construction
where possible. This allows you to use pandas' `plot()`
calls directly, without calling `plt.show()`, and still
enables you to manually construct and `plt.show()`.

If your matplotlib is in non-interactive mode,
you can construct your figures as usual, and then call
`plt.show()` to render them to your terminal. This
works from both a repl and when running scripts.

Internally, this backend is somewhat based on matplotlib's
IPython support: it's a hybrid of image and GUI backend types.
It works by using matplotlib's `Agg` backend to render the
plot, and then calls `chafa` to display in the terminal. This means that plotting works as
expected, but the image drawn to your terminal isn't
interactive and animations aren't supported.