Reúna vários nós na matriz de nós

Reúna vários nós na matriz de nós

Tenho um problema de tamanho/alinhamento nos meus nós finais. insira a descrição da imagem aqui

Na verdade, imprimo desajeitadamente o nó e, em seguida, uso fit node para cobrir vários filhos.

insira a descrição da imagem aqui

Não é bonito. Deve haver algo mais inteligente e natural.

MWE

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,shadows,fit,matrix}
\usepackage{duckuments}

\begin{document}

\def\myimageA{\includegraphics[width=2cm]{example-image-duck}}
\def\myimageB{\includegraphics[width=1cm]{example-image-duck}}
\def\d{\textbf{Selling group}}
\def\e{\textbf{Investors}}


\begin{tikzpicture}[
        font=\sffamily,
        level1/.style={
            rounded corners, 
            fill=#1,
            inner sep=5pt,
            text=black,
            text centered,
            opacity = 0.5,
            text opacity = 1,
        },
        level2/.style={
            rounded corners, 
            fill=#1,
            inner sep=7pt,
            text=black,
            text centered,
            opacity = 0.5,
            text opacity = 1,
        },
        rectnode/.style={
            rounded corners, 
            fill=#1,
            inner sep=7pt,
            text=black,
            text centered,
            text opacity = 1,
        },
        level4/.style={
            fill=#1,
            draw=gray,
            inner sep=5pt,
            text=black,
            text width=1.5cm, 
            text centered,
            font=\tiny,
            anchor=north,
            opacity = 0.5,
            text opacity = 1,
        },
        myline/.style={
            draw=gray,
            opacity=0.7,
            arrows = {-latex},
            line width=1pt,
        },
    ]
    \matrix[
        matrix of nodes, 
        column sep=0.5ex, 
        row sep=3ex, 
        row 1/.style={nodes={level1={gray}}},
        row 2/.style={nodes={level2={gray}}},
        row 3/.style={nodes={rectnode={gray}}},
        row 4/.style={nodes={level4={gray}}},
        row 5/.style={nodes={rectnode={gray}}},
    ] (m) {
    &       &       & {\myimageA}               \\
    &       &       & {\myimageB}                   \\
    & {\myimageB}   &       & {\myimageB}   &       & {\myimageB}   \\
{\d}& {\d}  & {\d}  & {\d}  & {\d}  & {\d}  \\
x   & x     & x     & x     & x     & {\e}  \\  % <- I clumsily put the nodes like this
    }; 
        
    % I certainly should use a \path but not confortable with its syntax.
    \draw[myline] (m-1-4.south) -- (m-2-4);
    \draw[myline] (m-2-4.west) -| (m-3-2);   
    \draw[myline] (m-2-4.east) -| (m-3-6);   
    \draw[myline] (m-2-4.190) -| (m-4-3);    
    \draw[myline] (m-2-4.south) -| (m-3-4);  
    \draw[myline] (m-3-2.west) -| (m-4-1);   
    \draw[myline] (m-3-2.south) -| (m-4-2);      
    \draw[myline] (m-3-4.south) -| (m-4-4);      
    \draw[myline] (m-3-4.east) -| (m-4-5);           
    \draw[myline] (m-3-6.south) -- (m-4-6);              
    \draw[myline] (m-3-6.south) -- (m-4-6);                  
    
    \draw[myline] (m-4-1.south) -- (m-5-1);                  
    \draw[myline] (m-4-2.south) -- (m-5-2);                  
    \draw[myline] (m-4-3.south) -- (m-5-3);                  
    \draw[myline] (m-4-4.south) -- (m-5-4);                  
    \draw[myline] (m-4-5.south) -- (m-5-5);                  
    \draw[myline] (m-4-6.south) -- (m-5-6);                  
    

    \node[align=center,rectnode={gray},inner sep=0pt,fit=(m-5-1)(m-5-2)] {\e};
    \node[align=center,rectnode={gray},inner sep=0pt,fit=(m-5-3)(m-5-5)] {\e};

\end{tikzpicture}
\end{document}

Responder1

A sintaxe para desenhar uma linha perpendicular de um nó existente até a borda norte (não o centro da borda norte) de um nó existente é

\draw (node1) -- (node1.south|-node2.north)

Portanto, elimine a última linha da sua matriz e coloque os nós “Investidores” onde desejar. Coloquei-os 1.2cmabaixo da última linha da sua matriz. O primeiro está abaixo do m-4-2nó; o segundo está abaixo do ponto médio de m-4-4e m-4-5.

Então o comando

\draw[myline] (m-4-1.south) -- (m-4-1.south|-new1.north);

desenhará (m-4-1.south)diretamente até a borda norte de (new1), que é o que chamei de primeiro nó "Investidor".

insira a descrição da imagem aqui

\matrix[
    matrix of nodes, 
    column sep=0.5ex, 
    row sep=3ex, 
    row 1/.style={nodes={level1={gray}}},
    row 2/.style={nodes={level2={gray}}},
    row 3/.style={nodes={rectnode={gray}}},
    row 4/.style={nodes={level4={gray}}},
    row 5/.style={nodes={rectnode={gray}}},
] (m) {
&       &       & {\myimageA}               \\
&       &       & {\myimageB}                   \\
& {\myimageB}   &       & {\myimageB}   &       & {\myimageB}   \\
{\d}& {\d}  & {\d}  & {\d}  & {\d}  & {\d}  \\
%x   & x     & x     & x     & x     & {\e}  \\  % <- I clumsily put the nodes like this
}; 
        
\draw[myline] (m-1-4.south) -- (m-2-4);
\draw[myline] (m-2-4.west) -| (m-3-2);   
\draw[myline] (m-2-4.east) -| (m-3-6);   
\draw[myline] (m-2-4.190) -| (m-4-3);    
\draw[myline] (m-2-4.south) -| (m-3-4);  
\draw[myline] (m-3-2.west) -| (m-4-1);   
\draw[myline] (m-3-2.south) -| (m-4-2);      
\draw[myline] (m-3-4.south) -| (m-4-4);      
\draw[myline] (m-3-4.east) -| (m-4-5);           
\draw[myline] (m-3-6.south) -- (m-4-6);              
\draw[myline] (m-3-6.south) -- (m-4-6);  

\node[align=center, rectnode={gray}, minimum width=5cm] at ([yshift=-1.2cm]m-4-2)(new1){\e}; 
\node[align=center, rectnode={gray}, minimum width=3.5cm]at ([yshift=-1.2cm]$.5*(m-4-4)+.5*(m-4-5)$)(new2){\e};
\node[align=center, rectnode={gray}]at ([yshift=-1.2cm]m-4-6)(new3){\e};

\draw[myline] (m-4-1.south) -- (m-4-1.south|-new1.north);                  
\draw[myline] (m-4-2.south) -- (new1);                  
\draw[myline] (m-4-3.south) -- (m-4-3.south|-new1.north);                  
\draw[myline] (m-4-4.south) -- (m-4-4.south|-new2.north);                  
\draw[myline] (m-4-5.south) -- (m-4-5.south|-new2.north);                  
\draw[myline] (m-4-6.south) -- (new3); 

informação relacionada