Dans ce billet, je vais vous donner quelques pistes pour réussir à imbriquer des graphiques dans d’autres graphiques, grâce à la magie de PGFPlots.
Table des matières
Exemple minimal
Le principe consiste simplement à ajouter un nœud (node
) au milieu du graphique parent, et d’inclure dans ce nœud un nouveau graphique (enfant). PGFPlots ne supportant pas l’imbrication des environnements axis, il faut « enregistrer » la position souhaitée pour le graphique enfant (avec un coordinate
), puis utiliser cet enregistrement pour placer le nouveau nœud. On a donc :
\begin{tikzpicture} \begin{axis}[xlabel={$x$},ylabel={$f(x,0)$},width=\textwidth,xmin=0,xmax=360] \coordinate (pt) at (axis cs:180,0); \addplot+[mark=none] expression[domain=0:360,samples=1000]{sin(x)}; \end{axis} \node[anchor=south west] at (pt) { \begin{tikzpicture} \begin{axis}[footnotesize,xlabel={$y$},ylabel={$f(180,y)$}] \addplot +[mark=none,red] expression[domain=-1:1]{x^2}; \end{axis} \end{tikzpicture} }; \end{tikzpicture} |
En affichant les grilles
Si on rajoute les grilles (‘grid=major
‘ par exemple), alors le résultat est très laid, car le graphique enfant est par défaut transparent. Il faut donc forcer le fond blanc en ajoutant aux options du second axis :
axis background/.style={fill=white} |
On obtient donc le résultat escompté :
Ajouter un trait de liaison depuis un point donné
Si vous voulez donner un détail sur un point en particulier, il est de bon goût d’utiliser la fonction ad hoc : un pin
. Celui-ci est principalement défini par le point de départ et l’angle à donner.
\begin{tikzpicture} \begin{axis}[xlabel={$x$},ylabel={$f(x,0)$},width=\textwidth,xmin=0,xmax=360] \coordinate (pt) at (axis cs:180,0); \addplot+[mark=none] expression[domain=0:360,samples=1000]{sin(x)}; \end{axis} \node[pin={[pin distance=1.5cm,pin edge={red, thick}]20: \begin{tikzpicture}[baseline,trim axis left,trim axis right] \begin{axis}[footnotesize,xlabel={$y$},ylabel={$f(180,y)$}] \addplot +[mark=none,red] expression[domain=-1:1,samples=1000]{x^2}; \end{axis} \end{tikzpicture} }] at (pt) {}; \end{tikzpicture} |
Si vous voulez customiser un peu le pin
, je vous invite à lire ceci.
Effectuer un zoom sur une zone du graphique
Il existe une librairie de PGFPlots qui permet de tracer directement le zoom sur un zone précise. Exemple avec un limaçon de Pascal :
\usepgfplotslibrary{polar} % Pour les tracés en coordonnées polaires \usetikzlibrary{spy} \begin{tikzpicture}[spy using outlines={circle, magnification=2, connect spies}] \begin{polaraxis} \coordinate (pt) at (axis cs:0,0); \coordinate (posZoom) at (axis cs:130,1.5); \addplot+[mark=none,domain=0:360,samples=500] {1+cos(x)}; \begin{scope} \spy[green!70!black,size=1.5cm] on (pt) in node [fill=white] at (posZoom); \end{scope} \end{polaraxis} \end{tikzpicture} |
Ici, je définis deux point distincts : le premier (pt
) est le point sur lequel je veux zoomer ; le deuxième (posZoom
) définit l’endroit où je veux qu’apparaisse le zoom. Il est bien sûr possible de changer la forme de la zone zoomée (en remplaçant circle
par rectangle
par exemple), et la dimension de cette zone (option ‘size
‘ de \spy
).
Comme vous pouvez le constater, la commande \spy
fait un zoom sur tout le contenu de la zone, y compris les axes, la grille etc. L’inconvénient de cette méthode est qu’elle ne permet pas de ré-échantillonner la courbe zoomée : si la courbe globale n’est pas suffisamment lisse, la courbe zoomée le sera encore moins. Il vous faudra alors soit augmenter la résolution de la courbe, soit utiliser l’une des méthodes décrites plus haut.
Pour aller plus loin
Si je vous dis que toutes ces commandes sont compatibles avec les overlays
sous Beamer, je vous laisse imaginer l’étendue des possibilités !