Transformar forma no funciona - TikZ

Transformar forma no funciona - TikZ

Estoy intentando escalar la imagen completa pero no funciona.

\begin{tikzpicture} [scale=0.5, every node/.style={transform shape}]

\tikzstyle{startstop}   = [ellipse,   draw=orange, thick, fill=orange!20, text width=5em, minimum height=4em, text centered, dashed]
\tikzstyle{block}       = [rectangle, draw=blue,   thick, fill=blue!20,   text width=8em, minimum height=4em, shape aspect=2, text centered, rounded corners]

    % Define nodes in a matrix
    \matrix [column sep=10mm, row sep=7mm]
            {
                \node   [startstop]     (Signal)        {Trama de la señal};
                &\node  [block]         (DFT)           {Transformada Discreta de Fourier};
                &\node  [block]         (Module)        {Módulo};
                &\node  [block]         (MelFilt)       {Filtros Mel}; \\
                \node   [startstop]     (MFCC)          {MFCC};
                &\node  [block]         (Lifter)        {Lifter};
                &\node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
                &\node  [block]         (Log)           {Logaritmo}; \\
            };

    \node [draw, scale=1, rectangle, dashed, thick, fit=(DFT) (Module) (Log) (Lifter) (IDCT)] {};

    % connect all nodes DFT above
    \begin{scope} [every path/.style={line, line width=1.3pt}  ]

        %Down Lines 
        \path (Signal)  --  (DFT);
        \path (DFT)     --  (Module);
        \path (Module)  --  (MelFilt);
        \path (MelFilt.south)   --  (Log.north);
        \path (Log)     --  (IDCT);
        \path (IDCT)    --  (Lifter);
        \path (Lifter)  --  (MFCC);

    \end{scope}

\end{tikzpicture}

Y cuando reemplazotransformar formaparaescala=0.5, el montaje falla.

Respuesta1

Creo que el problema es la matriz. Tan pronto como cambié a los nodos normales, empezó a funcionar mejor. Tampoco creo que una matriz sea la herramienta adecuada en este caso, ya que funciona de forma un poco diferente. Alternativamente, sugeriría usar la chainsbiblioteca que también eliminará los comandos de línea adicionales a continuación. Finalmente, puede eliminar la fitbiblioteca y usarla calcpara dibujar un rectángulo ajustado alrededor de los nodos (por cierto, solo necesitaba dos para ajustarlos).

¡Por supuesto, ahora escala mejor!

Producción

ingrese la descripción de la imagen aquí

Código

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}

\usetikzlibrary{shapes.geometric, chains, calc}

\tikzset{
    startstop/.style={ellipse,   draw=orange, thick, fill=orange!20, text width=5em, minimum height=4em, text centered, dashed},
    block/.style={rectangle, draw=blue,   thick, fill=blue!20,   text width=8em, minimum height=4em, shape aspect=2, text centered, rounded corners},
    links/.style={line width=1.3pt}
}

\begin{document}
\begin{tikzpicture}[scale=.5,transform shape,
    start chain=going right, node distance=1cm, auto,
    every join={line width=1.3pt},
    every node/.style={on chain, join}
    ]

% Define nodes in a matrix
\node[startstop] (Signal)  {Trama de la señal};
\node[block]     (DFT)     {Transformada Discreta de Fourier};
\node[block]     (Module)  {Módulo};
\node[block]     (MelFilt) {Filtros Mel};
\node[continue chain=going below,block] (Log) {Logaritmo};
\node[continue chain=going left, block] (IDCT) {Transformada Discreta Inversa de Coseno};
\node[continue chain=going left, block]     (Lifter)  {Lifter};
\node[continue chain=going left, startstop] (MFCC)    {MFCC};

% connect all nodes DFT above
\draw[dashed, thick, rounded corners] ($(Lifter.south west)+(-.2,-.2)$) rectangle ($(MelFilt.north east)+(.2,.2)$);

\end{tikzpicture}
\end{document}

Respuesta2

Del manual de TikZ:

Es posible transformar nodos, pero, de forma predeterminada, las transformaciones no se aplican a los nodos. La razón es que normalmente no desea que el texto se escale o gire incluso si se transforma el gráfico principal. Escalar el texto es malo, rotarlo un poco menos. Sin embargo, a veces desea transformar un nodo; por ejemplo, ciertamente a veces tiene sentido rotar un nodo 90 grados. Hay dos maneras de lograr esto:

  1. Puede utilizar la siguiente opción:

    /tikz/transformar forma (sin valor)

Hace que la matriz de transformación "externa" actual se aplique a la forma. Por ejemplo, si dijiste \tikz[scale=3] y luego dices nodo[transformar forma] {X}, obtendrás una X "enorme" en tu gráfico.

  1. Puede dar opciones de transformación dentro de la lista de opciones del nodo. Estas transformaciones siempre se aplican al nodo.

Entonces, si es posible, ¡evite escalar! Si aún persistes, conviértelo en tu MWe de la siguiente manera:

\documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{fit,matrix,shapes.geometric}

    \begin{document}
\begin{tikzpicture} [
 every node/.style = {scale=0.5, transform shape, % <-----
                      align=center, minimum height=4em},
  startstop/.style = {ellipse, draw=orange, thick, dashed, 
                      fill=orange!20, text width=5em},
      block/.style = {rectangle, draw=blue, thick, rounded corners, 
                      fill=blue!20, text width=8em}
                    ]
% Define nodes in a matrix
\matrix [column sep=10mm, row sep=7mm]
{
\node[startstop]    (Signal)   {Trama de la señal};
    &   \node  [block]         (DFT)           {Transformada Discreta de Fourier};
    &   \node  [block]         (Module)        {Módulo};
    &   \node  [block]         (MelFilt)       {Filtros Mel}; \\
\node  [startstop]  (MFCC)     {MFCC};
    &   \node  [block]         (Lifter)        {Lifter};
    &   \node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
    &   \node  [block]         (Log)           {Logaritmo}; \\
            };
\node[draw, dashed, thick, 
      scale=2, % <-----
      fit=(DFT) (Log)] {};
% connect all nodes DFT above
\draw[line width=1.3pt,->] 
    (Signal)  edge  (DFT)
    (DFT)     edge  (Module)
    (Module)  edge  (MelFilt)
    (MelFilt) edge  (Log)
    (Log)     edge  (IDCT)
    (IDCT)    edge  (Lifter)
    (Lifter)  edge  (MFCC);
\end{tikzpicture}
    \end{document}

Los principales cambios en su código se indican con <---. Otros cambios solo optimizan ligeramente su código y (según mi gusto) mejoran la apariencia. Por supuesto, se obtiene una mejor apariencia sin descamación.

Como puede ver, el nodo, que activa los nodos azules, se vuelve a escalar con el valor inverso de la escala del nodo. Esto es necesario, ya que para colocar los nodos no fue necesario escalarlo.

El resultado es:

ingrese la descripción de la imagen aquí

Respuesta3

No está muy claro si también desea escalar el texto. Pero hay muchos posts sobre este tema por aquí. Para su ejemplo, transform canvas={scale=.5}debería funcionar. ¿Es esto lo que quieres?

Tenga en cuenta que tuve que eliminar el estilo linede su archivo scope, ya que no sabía de dónde viene.

% arara: pdflatex

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage{tikz}
\usetikzlibrary{shapes, fit}    

\begin{document}
\begin{tikzpicture}[%
    ,transform canvas={scale=.5}
    ,startstop/.style={%
        ,ellipse
        ,draw=orange
        ,thick
        ,fill=orange!20
        ,text width=5em
        ,minimum height=4em
        ,text centered
        ,dashed
        }
    ,block/.style={%
        ,rectangle
        ,draw=blue
        ,thick
        ,fill=blue!20
        ,text width=8em
        ,minimum height=4em
        ,shape aspect=2
        ,text centered
        ,rounded corners
        }
    ]
% Define nodes in a matrix
\matrix[column sep=10mm, row sep=7mm]
    {%
    \node   [startstop]     (Signal)        {Trama de la señal};
    &\node  [block]         (DFT)           {Transformada Discreta de Fourier};
    &\node  [block]         (Module)        {Módulo};
    &\node  [block]         (MelFilt)       {Filtros Mel}; \\
    \node   [startstop]     (MFCC)          {MFCC};
    &\node  [block]         (Lifter)        {Lifter};
    &\node  [block]         (IDCT)          {Transformada Discreta Inversa de Coseno};
    &\node  [block]         (Log)           {Logaritmo}; \\
    };
\node[draw, rectangle, dashed, thick, fit=(DFT) (Module) (Log) (Lifter) (IDCT)] {};
% connect all nodes DFT above
\begin{scope}[every path/.style={draw,line width=1.3pt}]
\path (Signal)  --  (DFT);
\path (DFT)     --  (Module);
\path (Module)  --  (MelFilt);
\path (MelFilt.south)   --  (Log.north);
\path (Log)     --  (IDCT);
\path (IDCT)    --  (Lifter);
\path (Lifter)  --  (MFCC);
\end{scope}
\end{tikzpicture}
\end{document}

información relacionada