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 :
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')