[Tikz] Graduation automatique des axes

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

[Tikz] Graduation automatique des axes

Message par jmd »

Bonjour,

J'ai écrit une petite macro qui me permet de dessiner les deux axes de coordonnées sur des intervalles [xmin,xmax] et [ymin,ymax] (les 4 paramètres) et de les graduer automatiquement, sauf l'origine.
Après l'appel de cette macro, il me suffit de dessiner le graphique de f(x).
Voir ECM ci-dessous.
Ma question : dans l'instruction \foreach \x in {\xmin,...,\xmax} c'est tikz qui "décide" du nombre de graduations et j'aimerais en mettre un peu plus, si c'est possible.
Je sais qu'en mettant un troisième nombre dans la liste, la différence entre les deux premiers fait office d'incrément (par exemple \x in {1,1.5,...,5}) pour un incrément de 0.5, ce qui correspondrait à \x in {1,1.5,2,2.5,3,3.5,4,4.5,5}
Si je veux découper l'intervalle [xmin,xmax] en 5 sous-intervalles, il me suffirait, en théorie, de prendre comme second nombre de la liste \xmin+(\xmax-\xmin)/5.
MAIS çà ne marche pas ; j'ai l'impression que l'expression n'est pas calculée...

Merci d'avance ! et belle journée

Code : Tout sélectionner

% tikz-axes

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{ifthen}

\begin{document}

% macro \axes{xmin}{xmax}{ymin}{ymax}
\newcommand\axes[4]{
\pgfmathsetmacro\xmin{#1}
\pgfmathsetmacro\xmax{#2}
\pgfmathsetmacro\ymin{#3}
\pgfmathsetmacro\ymax{#4}
\draw[-] (\xmin,0) -- (\xmax,0) node[above]{$x$};
\draw[-] (0,\ymin) -- (0,\ymax) node[right]{$y$};

\foreach \x in {\xmin,...,\xmax}
\ifthenelse{0=\x}{;}{\draw[shift={(\x,0)}] (0pt,1pt) -- (0pt,-1pt) node[below]{\scriptsize $\x$};};
 
\foreach \y in {\ymin,...,\ymax}
\ifthenelse{0=\y}{;}{\draw[shift={(0,\y)}] (1pt,0pt) -- (-1pt,0pt) node[left] {\scriptsize $\y$};};
}
% fin macro \axes

% appel macro \axes pour graphique f(x)
\begin{tikzpicture}[scale=2]
\axes{-1}{2}{-2}{3}
\draw[line width=0.8pt,magenta,domain=\xmin:\xmax-0.2] plot (\x,{\x^3-\x-1});

\end{tikzpicture}

\end{document}
[\code]
Dernière modification par kojak le mercredi 05 août 2020, 10:08, modifié 1 fois.

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1459
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: [Tikz] Graduation automatique des axes

Message par evariste_G »

Bonjour.

Après examen de votre code, il me semble plus judicieux de vous proposer une autre alternative peut-être plus claire, en faisant appel à pgfplots:

Code : Tout sélectionner

\documentclass{amsart}
\usepackage[margin=2cm]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    xmin = -1,
    xmax = 2,
    ymin = -2,
    ymax = 3,
    grid = both,
    grid style = {
    		line width=.1pt, 
    		draw=gray!10},
    major grid style = {
    		line width = 0.2pt,
    		draw = gray!50},
    axis lines = middle,
    minor tick num = 0, % à changer pour plus de subdivisions
    enlargelimits = { abs = 0 },
    axis line style = {-},
    ticklabel style = {
    		font = \tiny,
    		fill = white},
    xlabel style = {
    		at = {(ticklabel* cs:1)},
    		anchor = north west
    				},
    ylabel style = {
    		at = {(ticklabel* cs:1)},
    		anchor = south west
    				}
]
\node[above left] at (2,0) {\scriptsize $x$};
\node[below right] at (0,3) {\scriptsize $y$};
\draw[line width=0.8pt,magenta,domain=-1:2] plot (\x,{\x^3-\x-1});
\end{axis}
\end{tikzpicture}
\end{document}
qui donne:
Sans titre.png
Bien sûr, il faudra repenser la syntaxe globale car je pense qu'il serait plus judicieux de créer un environnement et non une macro.
Ceci est ma façon de voir les choses, mais peut-être ne conviendra-t-elle pas au final...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Mathématiques, LaTeX et Python : https://www.mathweb.fr
Cours particuliers par webcam : https://cours-maths-webcam.fr

jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

Re: [Tikz] Graduation automatique des axes

Message par jmd »

Merci evariste_G pour la réponse rapide !

Cette autre solution me convient très bien et me semble facilement adaptable à n'importe quelle situation ; j'avais déjà envisagé l'environnement 'axis', mais avec un résultat moins attrayant...

Je vais essayer de généraliser certaines choses.

Merci encore.

PS : ma question reste toutefois ouverte 8)

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2036
Inscription : lundi 01 octobre 2007, 10:20

Re: [Tikz] Graduation automatique des axes

Message par GMaths »

Bonjour,
jmd a écrit :
mercredi 05 août 2020, 13:25
PS : ma question reste toutefois ouverte 8)
La façon de tester l'égalité à 0 ne convient pas.
Comme de surcroit pour le foreach, on préfèrera des valeurs entières pour la variable compteur... voilà une source d'inspiration pour la boucle :

Code : Tout sélectionner

\pgfmathsetmacro\kmax{4}
\foreach \k in {0,...,\kmax}{
    \pgfmathsetmacro{\x}{\xmin+\k*(\xmax-\xmin)/(\kmax+1)}
    \ifthenelse{ \lengthtest{\x < -0.0001} \OR \lengthtest{\x > 0.0001} }
               {\draw[shift={(\x,0)}] (0pt,1pt) -- (0pt,-1pt) 
                                      node[below,thick,blue]{\scriptsize $\pgfmathprintnumber[fixed,precision=1]{\x}$};};
               {;}
}
Mais, même si j'ai répondu à la question soulevée pour le foreach,
c'est effectivement du côté de pgfplots qu'il est conseillé de se tourner.
Dernière modification par GMaths le jeudi 06 août 2020, 10:25, modifié 1 fois.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2036
Inscription : lundi 01 octobre 2007, 10:20

Re: [Tikz] Graduation automatique des axes

Message par GMaths »

Amélioration du code ci-dessus... qui ne fonctionnait pas lorsque, lors d'un passage dans la boucle, la variable \x censée contenir théoriquement 0, contient un nombre qui en est proche, du fait du calcul avec des flottants.

Mais faut-il redire que c'est tellement plus simple avec pgfplots pour réaliser ce qui est souhaité ? Je ne crois pas. :-)

jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

Re: [Tikz] Graduation automatique des axes

Message par jmd »

Merci GMaths !

C'est vrai, c'est plus simple avec pgfplots ! Mais je suis quand-même satisfait de ta solution.
Je suppose aussi qu'il faut remplacer \nbr pas \kmax ...

J'ai des erreurs à la compilation, mais après ça passe quand-même.
Capture d’écran 2020-08-06 à 10.06.00.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2036
Inscription : lundi 01 octobre 2007, 10:20

Re: [Tikz] Graduation automatique des axes

Message par GMaths »

Bonjour,
jmd a écrit :
jeudi 06 août 2020, 10:22
Je suppose aussi qu'il faut remplacer \nbr pas \kmax ...
J'avais mis \nbr puis j'ai voulu changer (pour \kmax) en oubliant effectivement l'une des occurrences.
jmd a écrit :
jeudi 06 août 2020, 10:22
Capture d’écran 2020-08-06 à 10.06.00.png
Je vois, sur l'image, un appel avec un 5ème paramètre qui n'était pas présent dans la demande initiale.
Donc je ne vois pas comment je pourrais expliquer une erreur si la fonction \axes a évolué (un paramètre de plus) sans avoir le code complet.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2036
Inscription : lundi 01 octobre 2007, 10:20

Re: [Tikz] Graduation automatique des axes

Message par GMaths »

Autre remarque : en constatant que la valeur de ce nouveau paramètre est 0.2, j'ai peur de comprendre que c'est la valeur du pas souhaité et donc si on impose directement le pas (au lieu du nombre de subdivisions) :
  1. cela n'a plus rien à voir avec ce qui était demandé ;
  2. cela bouleverse totalement la façon de coder ;
  3. cela donne encore plus de raison d'utiliser pgfplots, qui permet cela directement.

jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

Re: [Tikz] Graduation automatique des axes

Message par jmd »

Oups, désolé ! le cinquième paramètre sert à allonger un peu les axes pour permettre de mettre une flèche qui ne se superpose pas au dernier trait de graduation.
C'est un peu du chipotage, mais finalement c'est vrai qu'il ne faut pas s'occuper de tout cela avec pgfplots...

Code : Tout sélectionner

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{ifthen}
% pour pgfplots
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

% macro \axes{xmin}{xmax}{ymin}{ymax}{rawette}
% \rawette=rallongement des axes pour flèche
\newcommand\axes[5]{
\pgfmathsetmacro\xmin{#1}
\pgfmathsetmacro\xmax{#2}
\pgfmathsetmacro\ymin{#3}
\pgfmathsetmacro\ymax{#4}
\pgfmathsetmacro\rawette{#5}
\draw (\xmin,0) -- (\xmax,0) ;
\draw (0,\ymin) -- (0,\ymax);
\draw[->] (\xmax,0) -- (\xmax+\rawette,0) node[above]{$x$};
\draw[->] (0,\ymax) -- (0,\ymax+\rawette) node[right]{$y$};


\pgfmathsetmacro\kmax{4}
\foreach \k in {0,...,\kmax}{
    \pgfmathsetmacro{\x}{\xmin+\k*(\xmax-\xmin)/(\kmax+1)}
    \ifthenelse{ \lengthtest{\x < -0.0001} \OR \lengthtest{\x > 0.0001} }
               {\draw[shift={(\x,0)}] (0pt,1pt) -- (0pt,-1pt) 
                                      node[below,thick,blue]{\scriptsize $\pgfmathprintnumber[fixed,precision=1]{\x}$};};
               {;}
}

%\foreach \x in {\xmin,...,\xmax}
%\ifthenelse{\equal{\x}{0}}{;}{\draw[shift={(\x,0)}] (0pt,1pt) -- (0pt,-1pt) node[below]{\scriptsize $\x$};};
 
\foreach \y in {\ymin,...,\ymax}
\ifthenelse{\equal{\y}{0}}{;}{\draw[shift={(0,\y)}] (1pt,0pt) -- (-1pt,0pt) node[left] {\scriptsize $\y$};};
}
% fin macro \axes

% appel macro \axes pour graphique f(x)
\begin{tikzpicture}[scale=1.5]
\axes{-1}{2}{-2}{3}{0.2}
\draw[line width=0.8pt,magenta,domain=\xmin:\xmax-0.2] plot (\x,{\x^3-\x-1});
\end{tikzpicture}
\end{document}

jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

Re: [Tikz] Graduation automatique des axes

Message par jmd »

Puisque dans Mathematex il y a Mathématique et LaTeX...

Juste pour info, la racine réelle de x^3-x-1 s'appelle nombre plastique ou encore nombre d'argent, que l'on peut calculer à partir de la suite de Padovan, de manière similaire au nombre d'or avec la suite de Fibonacci... pour les intéressé(e)s, voir la doc sur le net...

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1459
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: [Tikz] Graduation automatique des axes

Message par evariste_G »

jmd a écrit :
jeudi 06 août 2020, 11:04
Puisque dans Mathematex il y a Mathématique et LaTeX...

Juste pour info, la racine réelle de x^3-x-1 s'appelle nombre plastique ou encore nombre d'argent, que l'on peut calculer à partir de la suite de Padovan, de manière similaire au nombre d'or avec la suite de Fibonacci... pour les intéressé(e)s, voir la doc sur le net...
Pas totalement exact... Le nombre de plastique n'est pas le nombre d'argent. J'en parle dans "Ainsi de suite" : les nombres de métal sont issus des suites de k-bonacci (appellation proposée par Gilles Hainry, professeur à l’université du Mans à l’époque des faits, donc en 1996; j'en parle dans cet article).
De plus, sur cette page, on définit les nombres metalliques d'une autre façon.

Bref, ce sujet est délicat puisque tout le monde semble y aller de sa propre définition :-)
Mathématiques, LaTeX et Python : https://www.mathweb.fr
Cours particuliers par webcam : https://cours-maths-webcam.fr

jmd
Utilisateur confirmé
Utilisateur confirmé
Messages : 32
Inscription : samedi 06 février 2016, 11:08

Re: [Tikz] Graduation automatique des axes

Message par jmd »

Merci pour cette précision !
et elle m'a permis en plus de faire le lien entre votre pseudo, célèbre mathématicien, l'auteur du site, superbe, que j'ai plusieurs fois consulté, entre autre pour vous demander la permission d'utiliser un certain mathbook.cls ...

Belle journée, et je vous tire mon chapeau !