Je voudrais réaliser ce diagramme :

alt text

mais j'ai quelques difficultés à le réaliser. J'ai notamment essayé avec le package smartdiagram.

L'idéal serait de le faire dans le mode beamer (diagramme animé).

Mise à jour de la question

J'ai oublié de préciser que les différents éléments dans les bulles correspondent à du texte plus ou moins long. C'est un diagramme d'explication qui montre la démarche scientifique d'une étude.

J'ai ajouté un argument à \begin{tikzpicture} c'est pour permettre l'utilisation du passage à la ligne.

En compilant on constate que la hauteur totale du diagramme ne change pas et ne s'adapte pas automatiquement au contenu.

Ouvrir dans l'éditeur
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}
    \begin{frame}
        \begin{tikzpicture}[every text node part/.style={align=center}]
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (a)at(5,4){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (b)at(4,3){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (c)at(6,3){Texte vraiment très long};

        \node[draw,circle,rounded corners=3pt,fill=blue!10] (un)at(5,2){Texte vraiment \\ très long};

        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (deux)at(5,1){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (trois)at(5,0){Texte vraiment \\ très long};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (b) -- (a) node[midway,left]{bla bla bla};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (c) -- (a) node[midway,right]{bla bla bla};

        \only<2>{   
            \draw[->,draw=blue,fill=blue,line width=1mm] (un.south) -- (deux.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (deux.south) -- (trois.north);

            \draw[->,draw=blue,fill=blue,line width=1mm] (a.south) -- (un.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (b) -- (un);
            \draw[->,draw=blue,fill=blue,line width=1mm] (c) -- (un);
        }
        \end{tikzpicture}
    \end{frame}
\end{document}

Posée 09 Mai '16, 19:34

nicolasecl's gravatar image

nicolasecl
53115
Taux d'acceptation : 0%

Modifiée 12 Nov '16, 00:49

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

Je précise que si @nicolasecl met à disposition son image via une adresse URL, c'est parce que l'insérer directement nécessite une réputation de 60 points minimum que, en tant que nouvel utilisateur du présent site, il n'a pas encore acquise. Je vais éditer sa question pour que l'image y figure directement.

(09 Mai '16, 22:18) denis ♦♦ denis's gravatar image

J'ai oublié de préciser que les différents éléments dans les bulles correspondent à du texte plus ou moins long. C'est un diagramme d'explication qui montre la démarche scientifique d'une étude.

J'ai ajouté un argument à begin{tikzpicture} c'est pour permettre l'utilisation du passage à la ligne.

En compilant on constate que la hauteur totale du diagramme ne change pas et ne s'adapte pas automatiquement au contenu.

Ouvrir dans l'éditeur
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}
    \begin{frame}
        \begin{tikzpicture}[every text node part/.style={align=center}]
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (a)at(5,4){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (b)at(4,3){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (c)at(6,3){Texte vraiment très long};

\node[draw,circle,rounded corners=3pt,fill=blue!10] (un)at(5,2){Texte vraiment \\ très long};

\node[draw,rectangle,rounded corners=3pt,fill=blue!10] (deux)at(5,1){Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (trois)at(5,0){Texte vraiment \\ très long};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (b) -- (a) node[midway,left]{bla bla bla};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (c) -- (a) node[midway,right]{bla bla bla};

\only<2>{   
            \draw[->,draw=blue,fill=blue,line width=1mm] (un.south) -- (deux.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (deux.south) -- (trois.north);

\draw[->,draw=blue,fill=blue,line width=1mm] (a.south) -- (un.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (b) -- (un);
            \draw[->,draw=blue,fill=blue,line width=1mm] (c) -- (un);
        }
        \end{tikzpicture}
    \end{frame}
\end{document}
(10 Mai '16, 13:22) nicolasecl nicolasecl's gravatar image

Cette réponse ressemble plus à un commentaire qu'à une réponse.

(10 Mai '16, 15:25) jerome dequeker jerome%20dequeker's gravatar image

@nicolasecl Attention ! Cette réponse était un commentaire plutôt qu'une réponse et a été convertie comme tel.

(11 Mai '16, 00:37) denis ♦♦ denis's gravatar image

@nicolasecl En fait, il s'agissait même plus d'une modification de la question originale (ce que l'auteur d'une question peut toujours faire) que d'un commentaire et je vais donc le convertir comme tel.

(11 Mai '16, 11:36) denis ♦♦ denis's gravatar image

En fait, cette réponse était plutôt un commentaire à ma réponse qu'une modification de la question.

(11 Mai '16, 11:38) jerome dequeker jerome%20dequeker's gravatar image

@nicolasecl Attention ! Les contre-obliques (\) saisies telles quelles dans les contributions ne sont pas visibles. Pour insérer du ⟨code⟩, notamment des commandes LaTeX, le mieux est de recourir au raccourci Ctrl+k (dans les questions et réponses) et à `⟨code⟩` (dans les commentaires). Cf. la FAQ Comment mettre en forme ma contribution ?. Merci de corriger votre contribution si cela n'a pas déjà été fait.

(11 Mai '16, 11:39) denis ♦♦ denis's gravatar image

@jerome dequeker En effet mais il me semble plus lisible de faire figurer dans la question originale les précisions apportées au fur et à mesure des réponses qui convergent vers celle solutionnant véritablement le problème (qui était éventuellement pas complètement explicite dans la 1re mouture de la question). Je pense que la bonne marche à suivre est de faire figurer un commentaire indiquant que la réponse ne donne pas vraiment la solution escomptée et que la question va être éditée pour être précisée.

(11 Mai '16, 11:56) denis ♦♦ denis's gravatar image
Affichage de 5 parmi 8 Afficher 3 commentaire(s) en plus

Voici une méthode pour construire ce diagramme en TikZ.

Tout d'abord, pour positionner les nœuds les uns par rapport aux autres sans préciser leur coordonnées, j'ai besoin de la bibliothèque TikZ positioning. Pour dessiner les flèches par derrière les nœuds, j'ai besoin de la bibliothèque TikZ background.

Ouvrir dans l'éditeur
\usetikzlibrary{positioning,backgrounds}

Ensuite, au début de ma tikzpicture, je définis un certain nombre de styles que j'utilise pour caractériser chaque type d'objets. L'idéal serait de les nommer selon leur sémantique (plutôt que selon leur apparence). De plus, j'essaie de factoriser le plus de choses possibles : par exemple, je définis le style boite que je réutilise pour définir boite coins ronds et boite circulaire. J'en profite aussi pour fixer la distance par défaut entre les nœuds via node distance en utilisant une distance dite de Manhattan : 5mm verticalement et 0mm horizontalement.

Ouvrir dans l'éditeur
\tikzset{
  node distance=5mm and 0mm,
  boite/.style={
    fill=blue!50!cyan!70,draw,align=center,
    font=\footnotesize\bfseries,text=white,
  },
  boite coins ronds/.style={boite,rounded corners=3pt},
  boite circulaire/.style={boite,circle},
  fleche/.style={line cap=round,-latex,draw=blue!50!cyan!30,line width=0.25mm},
  grosse fleche/.style={fleche,line width=1mm},
}

Maintenant, je peux positionner les nœuds facilement en indiquant à chacun son type. Le premier nœud n'est pas positionné. Tous les autres sont positionnés relativement à l'un de ses prédécesseurs (via below left, below right, ou below). Pour choisir la position du nœud un, la distance par défaut ne convient pas : je précise donc une distance explicite via below=1cm of a.

Ouvrir dans l'éditeur
\node[boite coins ronds]  (a) {a\\Texte vraiment très long};
\node[boite coins ronds,below left=of a] (b) {b\\Texte vraiment\\très long};
\node[boite coins ronds,below right=of a] (c) {c\\Texte vraiment\\très long};
\node[boite circulaire,below=1cm of a] (un){1\\Texte vraiment\\très long};
\node[boite coins ronds,below=of un] (deux) {2\\Texte vraiment très long};
\node[boite coins ronds,below=of deux] (trois){3\\Texte vraiment\\très long};

À la fin, je crée un scope avec l'option on background layer pour que tout ce qu'il contient soit dessiné derrière ce qui précède et j'y dessine toutes les flèches.

Ouvrir dans l'éditeur
\begin{scope}[on background layer]
  \draw[fleche,shorten >=2mm] (b.north) -- (a.west)
     node[midway,left=4mm]{bla bla bla};
  \draw[fleche,shorten >=2mm] (c.north) -- (a.east)
     node[midway,right=4mm]{bla bla bla};

  \only<2>{   
    \draw[grosse fleche] (un) -- (deux);
    \draw[grosse fleche] (deux) -- (trois);
    \draw[grosse fleche] (a) -- (un);
    \draw[grosse fleche] (b.south) -- (un);
    \draw[grosse fleche] (c.south) -- (un);
  }
\end{scope}

Voici le résultat puis le code complet :

alt text

Ouvrir dans l'éditeur
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds}
\begin{document}
\begin{frame}
  \begin{tikzpicture}
    \tikzset{
      node distance=5mm and 0mm,
      boite/.style={
        fill=blue!50!cyan!70,draw,align=center,
        font=\footnotesize\bfseries,text=white,
      },
      boite coins ronds/.style={boite,rounded corners=3pt},
      boite circulaire/.style={boite,circle},
      fleche/.style={
        line cap=round,-latex,line width=0.25mm,
        draw=blue!50!cyan!30,
      },
      grosse fleche/.style={fleche,line width=1mm},
    }

    \node[boite coins ronds]  (a) {a\\Texte vraiment très long};
    \node[boite coins ronds,below left=of a] (b) {b\\Texte vraiment\\très long};
    \node[boite coins ronds,below right=of a] (c) {c\\Texte vraiment\\très long};
    \node[boite circulaire,below=1cm of a] (un){1\\Texte vraiment\\très long};
    \node[boite coins ronds,below=of un] (deux) {2\\Texte vraiment très long};
    \node[boite coins ronds,below=of deux] (trois){3\\Texte vraiment\\très long};

    \begin{scope}[on background layer]
      \draw[fleche,shorten >=2mm]
      (b.north) -- (a.west) node[midway,left=4mm]{bla bla bla};
      \draw[fleche,shorten >=2mm]
      (c.north) -- (a.east) node[midway,right=4mm]{bla bla bla};

      \only<2>{   
        \draw[grosse fleche] (un) -- (deux);
        \draw[grosse fleche] (deux) -- (trois);
        \draw[grosse fleche] (a) -- (un);
        \draw[grosse fleche] (b.south) -- (un);
        \draw[grosse fleche] (c.south) -- (un);
      }
    \end{scope}
  \end{tikzpicture}
\end{frame}
\end{document}
Lien permanent

Publiée 28 Mai '16, 11:25

Paul%20Gaborit's gravatar image

Paul Gaborit
2.0k16
Taux d'acceptation : 32%

Modifiée 08 Jui '16, 02:24

En effet, cette réponse est meilleure que la mienne ... Beau travail !

(30 Mai '16, 10:23) jerome dequeker jerome%20dequeker's gravatar image

@Paul Gaborit, il manque une virgule dans la définition du style de l'objet "fleche" au niveau du retour à la ligne. Merci de supprimer ce commentaire quand la correction aura été faite.

(07 Jui '16, 10:22) jerome dequeker jerome%20dequeker's gravatar image
1

@jerome dequeker Merci. J'ai corrigé.

(08 Jui '16, 02:26) Paul Gaborit Paul%20Gaborit's gravatar image
Ouvrir dans l'éditeur
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}
\begin{frame}
    \begin{tikzpicture}
    \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (a)at(5,4){a};
    \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (b)at(4,3){b};
    \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (c)at(6,3){c};

    \node[draw,circle,rounded corners=3pt,fill=blue!10] (un)at(5,2){1};

    \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (deux)at(5,1){2};
    \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (trois)at(5,0){3};
    \draw[->,draw=blue,fill=blue,line width=0.25mm] (b) -- (a) node[midway,left]{texte1};
    \draw[->,draw=blue,fill=blue,line width=0.25mm] (c) -- (a) node[midway,right]{texte2};

    \only<2>{   
        \draw[->,draw=blue,fill=blue,line width=1mm] (un.south) -- (deux.north);
        \draw[->,draw=blue,fill=blue,line width=1mm] (deux.south) -- (trois.north);

        \draw[->,draw=blue,fill=blue,line width=1mm] (a.south) -- (un.north);
        \draw[->,draw=blue,fill=blue,line width=1mm] (b) -- (un);
        \draw[->,draw=blue,fill=blue,line width=1mm] (c) -- (un);
    }
    \end{tikzpicture}
\end{frame}
\end{document}

Ou avec des coordonnées relatives (à ajuster plus facilement que les coordonnées absolues) :

Ouvrir dans l'éditeur
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
    \begin{frame}
        \begin{tikzpicture}[every text node part/.style={align=center}]
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] (trois)at(5,0){Texte vraiment \\ très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] at ($(trois)+(0,1.5)$) (deux) {Texte vraiment très long};
        \node[draw,circle,rounded corners=3pt,fill=blue!10] at($(deux)+(0,2.5)$) (un) {Texte vraiment \\ très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] at($(un)+(0,2.5)$) (a) {Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] at($(un)+(-3,1)$) (b) {Texte vraiment très long};
        \node[draw,rectangle,rounded corners=3pt,fill=blue!10] at($(un)+(3,1)$) (c) {Texte vraiment très long};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (b) -- (a) node[midway,left]{bla bla bla};
        \draw[->,draw=blue,fill=blue,line width=0.25mm] (c) -- (a) node[midway,right]{bla bla bla};
        \only<2>{   
            \draw[->,draw=blue,fill=blue,line width=1mm] (un.south) -- (deux.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (deux.south) -- (trois.north);

            \draw[->,draw=blue,fill=blue,line width=1mm] (a.south) -- (un.north);
            \draw[->,draw=blue,fill=blue,line width=1mm] (b) -- (un);
            \draw[->,draw=blue,fill=blue,line width=1mm] (c) -- (un);
        }
        \end{tikzpicture}
    \end{frame}
\end{document}
Lien permanent

Publiée 10 Mai '16, 10:43

jerome%20dequeker's gravatar image

jerome dequeker
836714
Taux d'acceptation : 65%

Modifiée 10 Mai '16, 14:35

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.