Bonsoir,

Pour mes graphiques, j'utilise en général asymptote mais je profite des vacances scolaires pour me pencher sur Tikz que je ne connais que de loin.

Ci-dessous, un code pour essayer d'obtenir un nuage de points et sa droite des moindres carrés de y en x (calculs faits en amont). Je n'obtiens malheureusement que le nuage de points.

J'ai vu qu'il existait aussi pgfplots mais ce sera pour les prochaines vacances. Là, j'aimerais vraiment comprendre pourquoi ma droite n'est pas visible.

Lorsque je commente le premier crochet d'options et le remplace par le seul [scientific axes={end labels}] j'obtiens au contraire la droite mais pas le nuage, qui est réduit à un point de coordonnées (50,250).

Est-ce un problème d'unités mal configurées ?

Merci de votre aide

\documentclass{article}%
\usepackage[paper=a4paper, portrait=true, twoside=false, left=1cm,
top=1cm, noheadfoot, includeall, nomarginpar,
centering=true]{geometry}%

\usepackage{tikz}
\usetikzlibrary{datavisualization,datavisualization.formats.functions}

\begin{document}

\begin{tikzpicture}
  \datavisualization
  % [scientific axes={end labels}]
  [scientific axes={end labels},
  all axes={unit length=1cm},
  x axis={attribute=prix,min value=250,max value=750,scaling=250 at 0cm and 750 at 10cm,
    ticks={step=50},
    grid={step=50,minor steps between steps=10},
    label=$x$},
  y axis={attribute=ventes,min value=50,max value=250,scaling=50 at 0cm and 250 at 20cm,
    ticks={step=10},
    grid={step=10,minor steps between steps=10},
    label=$y$},
  every major grid/.style = {style={thin,color=black!60!white}},
  every minor grid/.style = {style={very thin,color=black!30!white}}
  ]

[visualize as scatter=ventes]
  data [set=ventes] {
    prix, ventes
    300, 210
    350, 190
    400, 160
    450, 152
    500, 124
    600, 102
  }

[visualize as line=regression]
  data [set=regression,format=function] {
    var x : interval [250:750] samples 10;
    func y = -0.37 * \value x + 331.33;
  };
\end{tikzpicture}

\end{document}

Posée 18 Fév, 20:19

mumblee's gravatar image

mumblee
807
Taux d'acceptation : 0%

Modifiée 18 Fév, 20:21

Un peu hors-sujet, mais attention, l'équation de la droite calculée est erronée, ce n'est pas y=-0,37x +331,33 mais plutôt y =-0,37x +315,06. Voir ma réponse qui utilise un package capable de calculer l'équation de la droite et d'en afficher les coefficients.

(22 Fév, 06:36) quark67 quark67's gravatar image

Le package tkz-grapheur (d'un auteur talentueux francophone) permet de réaliser aisément ce qui est demandé, avec en prime un calcul intégré de la droite de régression linéaire, à partir des données.

tkz-grapheur charge en interne le package xint-regression (ce dernier permet d'afficher explicitement l'équation de la droite de régression en la calculant à partir des données).

Il est impératif, pour que le code suivant fonctionne, de disposer de la toute dernière version de tkz-grapheur (qui rajoute la possibilité d'ajouter du texte à des nœuds prédéfinis, liés aux axes). Cette version est sortie il y a quelques jours (version 0.30a, 13 février 2026).

Ceci permet de se rendre compte que la droite d'équation y = -0.37 * x + 331.33 n'est PAS la droite de régression linéaire correspondant aux points échantillonnés.

Le code suivant donne l'équation y = -0,366 + 315,057.

La pente est bien correcte, mais pas l'ordonnée à l'origine.

La simplicité et l'expressivité du code peuvent faire de tkz-grapheur un remplaçant fort intéressant de la bibliothèque datavisualization de TikZ.

\documentclass{article}
\usepackage[paper=a4paper, portrait=true, twoside=false, left=1cm,
top=1cm, noheadfoot, includeall, nomarginpar,
centering=true]{geometry}

\usepackage{tkz-grapheur}

\begin{document}

\def\LISTEXX{300,350,400,450,500,600}
\def\LISTEYY{210,190,160,152,124,102}

\begin{GraphiqueTikz}
[x=0.02cm,y=0.1cm,Xmin=250,Xmax=750,Xgrille=50,Xgrilles=5,
Origx=250,Origy=50,Ymin=50,Ymax=250,Ygrille=10,Ygrilles=1]

\TracerAxesGrilles[Elargir=2.5mm,Police=\footnotesize]{auto}{auto}

\TracerNuage[Style=o,CouleurNuage=red]{\LISTEXX}{\LISTEYY}

\TracerAjustement[Couleur=blue,Nom=ajust]<ajust>{lin}{\LISTEXX}{\LISTEYY}

\draw (axeox-ee) node[above right] {prix};
\draw (axeoy-nn) node[above left] {ventes};
\end{GraphiqueTikz}

\xintLINreg[round=3]{\LISTEXX}{\LISTEYY}%
La droite de régression linéaire est d'équation $y=\num{\linrega}\times x +\num{\linregb}$.

\end{document}

résultat

Lien permanent

Publiée 22 Fév, 06:28

quark67's gravatar image

quark67
3998
Taux d'acceptation : 63%

Modifiée 23 Fév, 06:59

Votre graphique comporte deux tracés: le nuage de points et la droite de tendance. Actuellement, les coordonnées du nuage sont définies par les attributs (prix, ventes), tandis que celles de la droite utilisent (x, y).

Le problème survient car l'option scientific axes lie par défaut les axes aux variables x et y. En revanche, vos définitions x axis={attribute=prix} et y axis={attribute=ventes} forcent les axes à suivre ces étiquettes spécifiques. Cette divergence de noms d'attributs explique pourquoi les deux tracés ne se superposent pas.

Voici trois solutions pour résoudre ce conflit:

Option 1 :

C'est la solution la plus simple. Elle consiste à renommer vos données pour qu'elles correspondent aux attributs par défaut des axes. Il suffit de remplacez

data [set=ventes] {
    prix, ventes

par

data [set=ventes] { 
    x, y

dans votre bloc de données et de supprimez les définitions explicites attribute=prix et attribute=ventes dans la configuration des axes.

Option 2 :

Si vous souhaitez conserver les noms prix et ventes pour plus de clarté dans votre code, vous devez adapter la fonction de régression: Modifiez le bloc de la fonction comme suit:

data [set=regression, format=function] {
  var prix : interval [250:750] samples 10;
  func ventes = -0.37 * \value{prix} + 331.33;
};

Option 3 :

Voir la section  Advanced: Creating New Axis Systems.

Lien permanent

Publiée 21 Fév, 21:00

touhami's gravatar image

touhami
10.4k410
Taux d'acceptation : 51%

Très belle explication ! Bravo !

(22 Fév, 04:36) quark67 quark67's gravatar image

Une collègue qui connaît mieux tikz qui moi (pas difficile !) m'a dépanné. Le problème, ce sont les attribute des axes qui sont nommés dans le nuage de points (prix et ventes)et ont des noms différents dans la droite de régression (x et y).

Dans la documentation, il semble que ces variables pourraient porter le même nom dans les deux ensembles de données mais avec autre chose que x et y la compilation échoue.

Voici néanmoins un code rectifié qui compile correctement (avec quelques extras dont j'ai eu besoin).


\documentclass{article}%
\usepackage[paper=a4paper, portrait=true, twoside=false, left=1cm,
top=1cm, noheadfoot, includeall, nomarginpar,
centering=true]{geometry}%

\usepackage{tikz}
% \usetikzlibrary{datavisualization}
\usetikzlibrary{datavisualization.formats.functions}

\begin{document}

\begin{tikzpicture}
\datavisualization
[
scientific axes={end labels},
all axes={unit length=1cm},
x axis={attribute=x,min value=250,max value=750,scaling=250 at 0cm and 750 at 10cm,
  ticks={step=50},
  grid={step=50,minor steps between steps=10},
  label=$x$},
y axis={attribute=y,min value=50,max value=250,scaling=50 at 0cm and 250 at 20cm,
  ticks={step=10},
  grid={step=10,minor steps between steps=10},
  label=$y$},
every major grid/.style = {style={thin,color=gray!60!white}},
every minor grid/.style = {style={very thin,color=gray!30!white}}
]

[visualize as line=droite,droite={style={color=blue}}]
data [set=droite,format=function] {
  var x : interval [250:750] samples 10;
  func y = -0.37 * \value x + 331.33;
}

[visualize as scatter=nuage,nuage={style={mark=+,mark size=3pt,line width=1pt}}]
data [set=nuage] {
  x,y
  300,223
  350,202
  400,180
  450,172
  500,135
  600,114
}
info {
  \draw [red] plot [mark=+,mark size=3pt,mark options={line width=1pt}]
  (visualization cs: x=433.3333333333333,y=171.0)
  node [above right,font=\footnotesize] {$G$};
  \draw [blue] plot [mark=+,mark size=3pt,mark options={line width=1pt}] (visualization cs: x=300, y=220.0)
  node [above right] {$A$};
  \draw [blue] plot [mark=+,mark size=3pt,mark options={line width=1pt}] (visualization cs: x=600, y=109.0)
  node [above right] {$B$};
  \draw [purple] plot [mark=+,mark size=3pt,mark options={line width=1pt}] (visualization cs: x=700, y=72.0) node (a) {};
};

\draw [color=purple,style=dashed,line width=1pt] (a) -- (a |- , 0);
\draw [color=purple,style=dashed,line width=1pt] (0, |- a) -- (a);
\end{tikzpicture}

\end{document}
Lien permanent

Publiée 21 Fév, 19:12

mumblee's gravatar image

mumblee
807
Taux d'acceptation : 0%

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.