Page 1 sur 1

Construction d'un diagramme en barres en 3D

MessagePosté: Samedi 13 Juin 2009, 14:05
par evariste_G
Bonjour.

Depuis quelques jours, je travaille sur une macro qui construit des histogrammes en 3D.

Mon travail est achevé et je me permets de vous le présenter au cas où il y aurait des intéressés. Bien entendu, je sous ouvert à toutes remarques.

Merci à pg pour son aide si précieuse (comme l'eau ... :) ) car je ne suis pas un expert en programmation LaTex.

Le code suivant :

Code: Tout sélectionner
\documentclass[10pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{xifthen}
\usetikzlibrary[arrows,fadings]

\newif\iffirstiteration
\newcounter{nb}

\newcommand{\barre}[6]
{ % n° colonne, largeur, hauteur, coefficient de profondeur, couleur, texte
   \def\Ey{#3}
   \pgfmathparse{(#1-1)*#2} \let\Ex\pgfmathresult
   \pgfmathparse{#4*cos(-135)+\Ex} \let\Ax\pgfmathresult
   \pgfmathparse{#4*sin(-135)+\Ey} \let\Ay\pgfmathresult
   \pgfmathparse{\Ax+#2} \let\Bx\pgfmathresult
   \pgfmathparse{\Ex+#2} \let\Fx\pgfmathresult 
   \pgfmathparse{\Ay-#3} \let\Cy\pgfmathresult
   \filldraw[fill=#5,draw=black] (\Ax,\Ay) rectangle +(#2,-#3);
   \filldraw[fill=#5!50,draw=black] (\Ax,\Ay) -- (\Ex,\Ey) -- (\Fx,\Ey) -- (\Bx,\Ay) -- cycle;
   \filldraw[fill=#5!20,draw=black] (\Bx,\Ay) -- (\Fx,\Ey) -- (\Fx,0) -- (\Bx,\Cy) -- cycle;
   \pgfmathparse{\Ax+#2/2} \let\texteB\pgfmathresult
   \node[rotate=45,below left] at (\texteB,\Cy) {\begin{tiny}\textcolor{#5}{#6}\end{tiny}};
}

\newcommand{\repere}[3]
{ % xmax, ymax, profondeur max
   \tikzfading[name=fade right,left color=transparent!0,right color=transparent!100]
   \tikzfading[name=fade left,left color=transparent!100,right color=transparent!0]
   \tikzfading[name=fade out,inner color=transparent!0,outer color=transparent!100]
   \pgfmathparse{#3*cos(-135)} \let\X\pgfmathresult
   \pgfmathparse{#3*sin(-135)} \let\Y\pgfmathresult
   \pgfmathparse{4*#1/3} \let\XXr\pgfmathresult
   \pgfmathparse{2*#1/3} \let\Xr\pgfmathresult
   \pgfmathparse{\Y+#2-0.5} \let\ZZ\pgfmathresult
   \pgfmathparse{#2-0.5} \let\YY\pgfmathresult
   \pgfmathparse{#1-0.3} \let\XX\pgfmathresult
   \pgfmathparse{\X+#1} \let\XXX\pgfmathresult
   \pgfmathparse{#1/2} \let\xsh\pgfmathresult
   \pgfmathparse{#3/2} \let\ysh\pgfmathresult
   \fill [gray!50,path fading=fade out,fading transform={xshift=-0.75 cm,yshift=0.5 cm}] (0,0) -- (\X,\Y) .. controls (\Xr,-#3) and (\XXr,\Y) .. (1.85*#1,0.5) -- cycle;
   \fill[white] (0,0) rectangle +(#1+1,\YY);
   \fill[gray!50,path fading=fade right] (0,0) rectangle +(#1,\YY);
   \fill[gray!50,path fading=fade left] (0,0) -- (0,\YY) -- (\X,\ZZ) -- (\X,\Y) -- cycle;
   \draw[->,>=stealth'] (0,0) -- (#1,0);
   \draw[->,>=stealth'] (0,0) -- (0,#2);   
   \draw[->,>=stealth'] (0,0) -- (\X,\Y);     
   \foreach \i in {1,2,...,\YY}
   {
      \pgfmathparse{(#3-0.2)*cos(-135)} \let\ZX\pgfmathresult
      \pgfmathparse{(#3-0.2)*sin(-135)+\i} \let\ZY\pgfmathresult
      \draw[dotted] (\ZX,\ZY) node[color=gray,left] {\begin{tiny}\i\end{tiny}} -- (0,\i) -- (\XX,\i) node[color=gray,right] {\begin{tiny}\i\end{tiny}};
     
   }
}

\def\spacebar[#1]#2{% échelle en X, échelle en Y, paramètres
   \begin{tikzpicture}[#1]
    \firstiterationtrue
    \def\xmaximum{0}
    \setcounter{nb}{0}
    \foreach \hauteur/\largeur/\coefprof/\couleur/\texte in {#2}
    {
      \ifx\largeur\empty\def\largeur{1}\fi
      \ifx\coefprof\empty\def\coefprof{0.33}\fi
      \iffirstiteration
        \xdef\hauteurmax{\hauteur}
        \xdef\coefprofmax{\coefprof}
      \else
        \ifnum\hauteurmax>\hauteur   
        \else
          \xdef\hauteurmax{\hauteur}
        \fi
        \pgfmathmax{\coefprofmax}{\coefprof}\global\let\coefprofmax\pgfmathresult
      \fi
      \global\firstiterationfalse     
      \pgfmathparse{\largeur+\xmaximum}\global\let\xmaximum\pgfmathresult       
    }
   
   \pgfmathparse{\xmaximum+1}\global\let\xmaximum\pgfmathresult   
   \pgfmathparse{\coefprofmax+0.66}\global\let\coefprofmax\pgfmathresult 
   \pgfmathparse{\hauteurmax+1}\global\let\hauteurmax\pgfmathresult 
   
   \repere{\xmaximum}{\hauteurmax}{\coefprofmax}
   
   \foreach \hauteur/\largeur/\coefprof/\couleur/\texte in {#2}
   {         
      \stepcounter{nb}
      \ifx\largeur\empty\def\largeur{1}\fi
      \ifx\coefprof\empty\def\coefprof{0.33}\fi
      \ifx\couleur\empty\def\couleur{blue}\fi
      \barre{\thenb}{\largeur}{\hauteur}{\coefprof}{\couleur}{\texte}
   }
   \end{tikzpicture}
}

\begin{document}

% Synthaxe : \spacebar{effectif, largeur de la colonne, profondeur de la colonne, couleur, caractère observé}

\spacebar[scale=1]{
       3/1/0.66/green/Bus,%
       5/1/0.33/red/Vélo,%
       2/1/0.66/purple/A pieds,%
       6/1/0.33/brown/Voiture,%
       4/1/0.66/magenta/Hélicoptère}

\end{document}


donne ceci :

diagramme.jpg


EDIT : je souhaite créer un fichier .sty dans lequel je mettrais ceci, avec des options pour la commande \spacebar.
Par exemple : \spacebar[grad] ferait inscrire les indications de graduation (en gris). Pour cela, j'utilise :

Code: Tout sélectionner
\define@boolkey[] {spacebar} {grad}[true]{}
\define@cmdkey [] {spacebar} {scale}{}


Mais là, ça me met le message suivant pour ces lignes :

Code: Tout sélectionner
Undefined control sequence


Comment cela se fait-il ?

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mercredi 08 Juillet 2009, 20:06
par MB
Je n'ai pas la réponse à ta question.
Je n'avais pas vu ce post, mais je te remercie pour le partage de ce code, d'autant que le résultat est vraiment très joli. :wink:

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Jeudi 09 Juillet 2009, 13:53
par evariste_G
Merci :D Au moins une chose que j'ai faite qui plaît à quelqu'un ... :)
Un forum, ça sert aussi à partager (et comme je fais souvent appel aux bonnes âmes, il est naturel de rendre en retour).

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Jeudi 09 Juillet 2009, 13:55
par projetmbc
Moi aussi ça me plait beaucoup... :clapping:

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 12:04
par Altermundus
projetmbc a écrit:Moi aussi ça me plait beaucoup... :clapping:


Bonjour

Avec le code donné j'ai une erreur bizarre

Package PGF Math Error: Unknown function `getargs'.

Alain Matthes

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 12:23
par plop08
je l'avais testé chez moi sans problème de compil, tu as surement un paquet manquant.

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 12:25
par evariste_G
Altermundus a écrit:
projetmbc a écrit:Moi aussi ça me plait beaucoup... :clapping:


Bonjour

Avec le code donné j'ai une erreur bizarre

Package PGF Math Error: Unknown function `getargs'.

Alain Matthes


Là, je ne pourrais pas te dire la raison de cette erreur ... :roll: Comme le code fonctionne chez certains, peut-être est-ce dû à la façon dont tu compiles ? (je dis ça mais ça me semble peu probable ... d'un autre côté, je ne m'y connais pas trop ...). J'ai fais ça sous windows et toi, tu travailles sous mac me semble-t-il ...

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 12:36
par plop08
Je viens de le compiler (après un copier coller donc sans modif) sous mac et ça passe.

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 13:05
par Altermundus
plop08 a écrit:Je viens de le compiler (après un copier coller donc sans modif) sous mac et ça passe.


J'ai le coupable ! le code ne passe pas avec la version cvs de tikz . Je vais voir si je peux apporter une modification et j'en profiterai pour voir si je peux placer des "keys" pour les options.

Alain Matthes

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Mardi 14 Juillet 2009, 15:01
par Altermundus
Le problème vient de

Code: Tout sélectionner
     \global\firstiterationfalse


On peut se passer de ce \global et je pense qu'avec la version pgf 2.00 cela doit fonctionner.
Ce que je ne comprends pas c'est l'erreur provoqué avec la version cvs.

Sinon pour le code, il faudrait déjà ne pas mettre tikzpicture dans la macro.

Code: Tout sélectionner
 \begin{tikzpicture}[scale=2]
\spacebar{%
       3/1/0.66/green/Bus,%
       5/1/0.33/red/Vélo,%
       2/1/0.66/purple/A pieds,%
       6/1/0.33/brown/Voiture,%
       4/1/0.66/magenta/Hélicoptère}
   \end{tikzpicture}


Cela permet à l'utilisateur sans toucher à la macro d'ajouter ses propres commandes tikz s'il le souhaite

J'ai fait un début de package sur les stats et pour les "keys" cela peut-être utile voir (attention c'est en utf8)

http://altermundus.fr/pages/downloads/tkz-tukey.sty

et la doc http://altermundus.fr/pages/downloads/TKZdoc-tk.pdf

je n'ai pas créé de diagrammes en 3D car je trouve cela pas nécessaire et dangereux en statistiques mais cela est un autre problème :)

Alain Matthes

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Dimanche 27 Janvier 2019, 19:27
par sintri
J'ai bien peur que cela soit trop tard pour déterrer ce sujet, mais pour mon TPE j'aurais besoin d'un diagramme 3D comportant deux paramètres et une seule échelle… quelqu'un saurait-il les modifications possibles dans la macro pour arriver à un tel résultat ?

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Dimanche 27 Janvier 2019, 19:54
par marco56
Un nouveau fil avec un ecm (exemple complet minimal) serait le bienvenu.

Re: Construction d'un diagramme en barres en 3D

MessagePosté: Dimanche 27 Janvier 2019, 20:29
par sintri
marco56 a écrit:Un nouveau fil avec un ecm (exemple complet minimal) serait le bienvenu.


Voilà qui est fait!