Imbriquer un graphique dans un autre avec PGFplots

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.

Exemple minimal

Exemple minimal
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é :

Fonc blanc pour cacher la grille du graphique parent
Fond blanc pour cacher la grille du graphique parent

Ajouter un trait de liaison depuis un point donné

Ajout d'un détail sur un point particulier
Ajout d’un détail sur un point particulier

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 :

Zoom sur le point de rebroussement du limaçon de Pascal
Zoom sur le point de rebroussement du 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 !