Créer et insérer directement des graphiques 3D avec Pythontex sous LaTeX

Créer et insérer directement des graphiques 3D avec Pythontex sous LaTeX

La prise en main et l’installation de Pythontex peut s’avérer assez fastidieuse quand on s’y met. Par expérience, je peux vous dire que la tâche est encore plus difficile sous Ubuntu quand on est novice (et je le suis !). C’est une des raisons pour lesquelles je n’ai pas souhaité resté sous Ubuntu pour me remettre à Windows.

Une fois Pythontex installé, je pense qu’il est légitime de vouloir l’exploiter à fond, y compris pour faire des choses qu’avec \(\LaTeX\) seul il est difficile de faire. Parmi ces choses,il y a les graphiques, et plus particulièrement les graphiques 3D (car les courbes 2D, PGF sait le faire facilement).

Un code Python

Avant tout, il faut savoir comment dessiner avec Python. Il est nécessaire pour cela d’utiliser le module matplotlib. Et pour une exploitation optimale, les modules numpy et scipy seront aussi utiles (elles contiennent des fonctions mathématiques).

Pour installer ces modules, il faut aller dans le terminale de son système d’exploitation et tapez les lignes :

pip install numpy
pip install scipy
pip install matplotlib

Pour voir si tout est bien installé, on pourra compiler le code suivant :

from pylab import *
from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(figure())
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='cool')
ax.plot_surface(X, Y, R, rstride=1, cstride=1, cmap='hot')
show()

On devrait voir apparaître une fenêtre contenant ceci :

 

Insérer l’image dans un fichier \(\LaTeX\)

La première méthode consiste à exporter ce dernier résultat au format PNG par exemple.

On peut le faire automatiquement avec la ligne :

savefig('macourbe.png')

mise en dernier dans le code Python précédent.

Mais il serait tout de même plus pratique de ne passer que pas une compilation \(\LaTeX\) non ?

Si on passe par Pythontex avec le code suivant :

\begin{pycode}
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(figure())
X = np.arange(-1, 1, 0.025)
Y = np.arange(-1, 1, 0.025)
X, Y = np.meshgrid(X, Y)
R = np.cos(X**2 + Y**2)
ax.plot_surface(X, Y, R, rstride=1, cstride=1, cmap='bone')
savefig('macourbe.png', bbox_inches='tight')
\end{pycode}
\includegraphics{macourbe.png}

on obtient une erreur car “macourbe.png” n’existe pas encore lors de la première double-compilation (pour utiliser Pythontex, il faut 2 compilations séparées par un appel à un fichier Python).

J’ai donc eu l’idée (mais je ne dois pas être le premier) à insérer un booléen dans le code \(\LaTeX\) et de définir une macro complémentaire.

En en-tête du document, je mets :

\newif\ifpythontex
\newcommand{\includegraphicx}[2][]{%
\ifpythontex
\includegraphics[#1]{#2}
\fi
}\
pythontexfalse

Je définis donc ici la macro “\includegraphicx” (notez le “x” à la place du “s” à la fin) qui affiche l’image si le booléen pythontex est vrai.

Lors de la première double-compilation, je laisse ce booléen à false. Cette double-compilation créera l’image et ensuite, je mets le booléen à true et je compile à nouveau… et le tour est joué !

Bien sûr, il faut utiliser la nouvelle macro :

\includegraphicx[scale=0.75]{macourbe.png}

Pour connaître les options de la commande savefig de matplotlib, on peut regarder la page suivante :

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html

 

Juste pour le fun, voici ce que donne :

from pylab import *
from mpl_toolkits.mplot3d import Axes3D

ax = Axes3D(figure())
X = np.arange(-1, 1, 0.025)
Y = np.arange(-1, 1, 0.025)
X, Y = np.meshgrid(X, Y)
R = np.cos(X**2 + Y**2)
ax.plot_surface(X, Y, R, rstride=1, cstride=1, cmap='bone')
savefig('19.png',transparent='true')

Cet article correspond au chapitre 4 de la mini-documentation que j’ai faite (https://www.mathweb.fr/euclide/initiation-a-python).

Stéphane Pasquet
Stéphane Pasquet

Auteur de livres parascolaires en mathématiques

Laissez votre message