%% Copyright 2021-2026 Tobias Enderle
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.

% DESCRIPTION
% Demonstrates how *matplotlib* plots can be generated and included in a
% document using *PGF*

\documentclass{article}

\usepackage{pyluatex}
\usepackage{unicode-math}
\usepackage{pgf}
\usepackage{url}

\begin{document}

In this document, we demonstrate how \emph{matplotlib} plots can be generated
and included in a document. In the Python code in this document, the plot is
configured and saved to PGF\footnote{\url{https://ctan.org/pkg/pgf}} code.
The PGF code is then included in the document and creates the plot.

To avoid intermediate files, the PGF code is saved into an in-memory file
using the Python \verb|io.StringIO| class%
\footnote{\url{https://docs.python.org/3/library/io.html#io.StringIO}}.

\begin{center}
\begin{python}
# example based on
# https://matplotlib.org/stable/gallery/lines_bars_and_markers/simple_plot.html
import matplotlib.pyplot as plt
import numpy as np
import io

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots(figsize=(5, 3.5))
ax.plot(t, s)

ax.set(xlabel='time (s)', ylabel='voltage (mV)',
       title='About as simple as it gets, folks')
ax.grid()

with io.StringIO() as file:  # save to "in-memory file"
  fig.savefig(file, format='pgf', bbox_inches='tight', pad_inches=0.1)
  print(file.getvalue())
\end{python}
\end{center}

For an alternative approach to creating plots with \emph{matplotlib},
consider the example \verb|matplotlib-external.tex|.

\end{document}
