![Flecha de tiempo con "posición actual" evolucionando con número superpuesto](https://rvso.com/image/461883/Flecha%20de%20tiempo%20con%20%22posici%C3%B3n%20actual%22%20evolucionando%20con%20n%C3%BAmero%20superpuesto.png)
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/y
clavedonde puedes cambiar la longitud y la dirección delyeje de laxyzsistema de coordenadas (el que no tiene unidades).
En lugar de usarlo, \axscale
puedes configurarlo y
en -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á elchains
biblioteca que en realidad solo estoy usando para unir nodos al no tenerloanda a cualquier lado. Para esto configuro un punto de inicio que está 1mm
arribat= 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 elCircle
consejoParece 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 ellabel
Aparecen 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 label
al 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 on
solución overlay-beamer-styles
dejará texto oculto en el marco (que se puede seleccionar y copiar), estoy usando el propio Beamer \uncover
para 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)
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}
Respuesta3
Usando la gran overlay-beamer-styles
biblioteca, 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}
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.