Flecha de tiempo con "posición actual" evolucionando con número superpuesto

Flecha de tiempo con "posición actual" evolucionando con número superpuesto

Estoy mostrando diapositivas donde muestro una evolución temporal a través de instantáneas. Cada instantánea corresponde a un momento específico.

Me gustaría mostrar una flecha de tiempo (verticalmente en el costado) con viñetas correspondientes a cada uno de los puntos de tiempo (espaciadas de manera desigual). En cada superposición, una de estas viñetas está llena y se especifica la hora actual, mientras que las otras viñetas están abiertas (círculos vacíos).

Creo que puedo hacer la versión no aminada con bastante facilidad tikz, pero no estoy seguro de cómo ajustar el estilo de los elementos y la presencia del texto del nodo según el número de superposición.

Aquí hay un MWE para una flecha de tiempo estática:

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
  \def\axscale{-0.02}
  \def\thex{0}
  \def\they{0}
  \def\prevy{0}
  \def\times{{-5,2, 12, 22, 32, 44, 76, 116, 182, 300,307}}
  \def\maxt{9}
  \foreach \it in {1,...,\maxt} {
        \pgfmathparse{\axscale*\times[\it-1]}
        \pgfmathsetmacro{\prevy}{\pgfmathresult}
        \pgfmathparse{\axscale*\times[\it]}
        \pgfmathsetmacro{\they}{\pgfmathresult}
        \draw[-{Circle[open]}] (\thex,\prevy) -- (\thex,\they);
        \node[right,anchor=west] at (\thex,\they) {
            $t=\pgfmathparse{\times[\it]}
            \pgfmathprintnumber[    % Print the result
                fixed,
                fixed zerofill,
                precision=0,
                assume math mode=true
            ]{\pgfmathresult}
            $};
  }
  \pgfmathparse{\axscale*\times[\maxt]}
  \pgfmathsetmacro{\prevy}{\pgfmathresult}
  \pgfmathparse{\axscale*\times[\maxt+1]}
  \pgfmathsetmacro{\they}{\pgfmathresult}
  \draw[->] (\thex,\prevy) -- (\thex,\they);
  %\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}
\end{document}

Entonces los elementos a animar son Circle[open]y si se muestra la t=...etiqueta.

Respuesta1

Creo que tienes tu respuesta, es decir, usa capas.conTikZ, y ambas respuestas muestran cómo se puede hacer esto.

Quiero mostrar una forma diferente de dibujar esta línea de tiempo usando algunas cosas que TikZ tiene para ofrecer, principalmentela /tikz/yclavedonde puedes cambiar la longitud y la dirección delyeje de laxyzsistema de coordenadas (el que no tiene unidades).

En lugar de usarlo, \axscalepuedes configurarlo yen -0.02cm(donde el valor predeterminado es 1 cm) y TikZ multiplica tu valor para transformarlo enlienzosistema de coordenadas (el que tiene unidades dondeytodavía apunta hacia arriba).

Luego, está elchainsbiblioteca que en realidad solo estoy usando para unir nodos al no tenerloanda a cualquier lado. Para esto configuro un punto de inicio que está 1mmarribat= 0 y también agrega un último punto que siempre está 1,4 mm por debajo del últimot. (Si necesita que el inicio superior de la línea esté a una distancia fija por encima del primertaquí es necesario un ajuste.) El último también se une ->para que obtengamos la punta de la flecha real.

Hablando de puntas de flecha, mientras que elCircleconsejoParece algo bueno, solo tocan la coordenada especificada en lugar de estar centrados en ellas. Esto puede serfijado, aunque aquí solo usaría nodos circulares.

Para que el proyector de diagramas sea consciente, estoy robando la <.>sintaxis deLa respuesta de Sam Cartertener ellabelAparecen al mismo tiempo que el llenado del nodo. Dado que estoy usando un nodo circular como referencia en lugar de una punta de flecha, en mi opinión, el nodo se alineará mucho mejor.

También podríamos agregar el labelal fill, es decir

alt=<+>{fill, label={$t = \t$}}{}

aunque esto hará que la imagen salte a menos que la etiqueta ya no contribuya al cuadro delimitador.
Dado que la visible onsolución overlay-beamer-stylesdejará texto oculto en el marco (que se puede seleccionar y copiar), estoy usando el propio Beamer \uncoverpara ocultar el texto.

Código

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, chains, overlay-beamer-styles}
\begin{document}
\begin{frame}
\begin{itemize}[<+->]
\item First.
\item Second.
\end{itemize}

\begin{tikzpicture}[
  y=-.02cm, thick, label position=right, start chain = going {},
  dot/.style={circle, draw, inner sep=+0pt, minimum size=+1.3mm}]
\coordinate[on chain]() at (0, 1mm); % a start (for the line)
\foreach \t in {2, 12, 22, 32, 44, 76, 116, 182, 300}
  \node[dot, on chain, join, alt=<+>{fill},
    label/.expanded={$\uncover<.>{t = \t}$}, % no hidden text in output
%    label={[visible on=<.>]$t = \t$},       % hidden text in output
  ] at (0, \t) {};
% and an end that is below the last dot
\coordinate[on chain, join=by ->]() at ([yshift=-1.4mm] chain-end.south);
\end{tikzpicture}
\end{frame}
\end{document}

Salida (haga clic para ver la versión completa)

Miniatura del archivo completo

Respuesta2

Puedes aprovechar el hecho de que los comandos tikz, como \draw, reconocen la superposición:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\begin{document}
\begin{frame}
\begin{tikzpicture}
  \def\axscale{-0.02}
  \def\thex{0}
  \def\they{0}
  \def\prevy{0}
  \def\times{{-5,2, 12, 22, 32, 44, 76, 116, 182, 300,307}}
  \def\maxt{9}
  \foreach \it in {1,...,\maxt} {
        \pgfmathparse{\axscale*\times[\it-1]}
        \pgfmathsetmacro{\prevy}{\pgfmathresult}
        \pgfmathparse{\axscale*\times[\it]}
        \pgfmathsetmacro{\they}{\pgfmathresult}
        \draw[-{Circle[open]}] (\thex,\prevy) -- (\thex,\they);
        \draw<+(2)>[-{Circle}] (\thex,\prevy) -- (\thex,\they);
        \node<.(2)>[right,anchor=west] at (\thex,\they) {
            $t=\pgfmathparse{\times[\it]}
            \pgfmathprintnumber[    % Print the result
                fixed,
                fixed zerofill,
                precision=0,
                assume math mode=true
            ]{\pgfmathresult}
            $};
  }
  \pgfmathparse{\axscale*\times[\maxt]}
  \pgfmathsetmacro{\prevy}{\pgfmathresult}
  \pgfmathparse{\axscale*\times[\maxt+1]}
  \pgfmathsetmacro{\they}{\pgfmathresult}
  \draw[->] (\thex,\prevy) -- (\thex,\they);
  %\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}
\end{frame}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Usando la gran overlay-beamer-stylesbiblioteca, puedes hacer:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{overlay-beamer-styles}

\begin{document}
\begin{frame}

\begin{tikzpicture}
  \def\axscale{-0.02}
  \def\thex{0}
  \def\they{0}
  \def\prevy{0}
  \def\times{{-5, 2, 12, 22, 32, 44, 76, 116, 182, 300, 307}}
  \def\maxt{9}
  \foreach \it in {1,...,\maxt} {
        \pgfmathparse{\axscale*\times[\it-1]}
        \pgfmathsetmacro{\prevy}{\pgfmathresult}
        \pgfmathparse{\axscale*\times[\it]}
        \pgfmathsetmacro{\they}{\pgfmathresult}
        \draw[alt={<\it>{-{Circle[]}}{-{Circle[open]}}}] (\thex,\prevy) -- (\thex,\they);
        \node[right,anchor=west] at (\thex,\they) {
            $t=\pgfmathparse{\times[\it]}
            \pgfmathprintnumber[    % Print the result
                fixed,
                fixed zerofill,
                precision=0,
                assume math mode=true
            ]{\pgfmathresult}
            $};
  \pgfmathparse{\axscale*\times[\maxt]}
  \pgfmathsetmacro{\prevy}{\pgfmathresult}
  \pgfmathparse{\axscale*\times[\maxt+1]}
  \pgfmathsetmacro{\they}{\pgfmathresult}
  \draw[->] (\thex,\prevy) -- (\thex,\they);
  }
  %\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}

\end{frame}
\end{document}

ingrese la descripción de la imagen aquí

O puede reemplazar alt={<\it>{-{Circle[]}}{-{Circle[open]}}}con alt={<\it->{-{Circle[]}}{-{Circle[open]}}}(es decir, agregar un -después \it) si desea mantener los puntos anteriores llenos.

información relacionada