graphiques 3D PythonTeX

Graphiques 3D avec Pythontex sous LaTeX

  • Dernière modification de la publication :26 octobre 2021
  • Temps de lecture :6 min de lecture
  • Commentaires de la publication :0 commentaire

Loading

Graphiques 3D et PythonTeX : 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).

Graphiques 3D et PythonTeX: 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 :

graphiques 3D et PythonTeX

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')
0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires