Стрелка времени с «текущим положением», развивающаяся с наложенным числом

Стрелка времени с «текущим положением», развивающаяся с наложенным числом

Я показываю слайды, где я показываю эволюцию времени, проходя через снимки. Каждый снимок соответствует определенному времени.

Я хотел бы показать стрелку времени (вертикально сбоку) с маркерами, соответствующими каждой временной точке (неравномерно расположенными). На каждом наложении один из этих маркеров заполнен сплошной заливкой и указано текущее время, тогда как другие маркеры открыты (пустые кружки).

Думаю, я смогу довольно легко сделать неаноминированную версию с помощью tikz, но я не уверен, как настроить стиль элементов и наличие текста узла в зависимости от номера наложения.

Вот MWE для статической временной стрелы:

\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}

Итак, элементы для анимации Circle[open]и необходимость отображения t=...метки.

решение1

Я думаю, вы получили ответ, т.е. используйте слои.сTikZ, и оба ответа показывают, как это можно сделать.

Я хочу показать другой способ нарисовать эту временную шкалу, используя несколько полезных вещей, которые может предложить TikZ, в основномключ/tikz/yгде вы можете изменить длину и направлениеуосьхyzСистема координат (без единиц измерения).

Вместо использования \axscaleвы можете просто установить yзначение -0.02cm(где по умолчанию 1 см), и TikZ умножит ваше значение, чтобы преобразовать его вхолстсистема координат (та, в которой единицы измеренияупо-прежнему указывает вверх).

Затем, есть ещеchainsбиблиотека который я на самом деле использую только для соединения узлов, не имея егопойти куда угодно. Для этого я устанавливаю начальную точку, которая находится 1mmвышет= 0, а также добавить последнюю точку, которая всегда находится на 1,4 мм ниже последнейт. (Если вам нужно, чтобы верхний старт линии находился на фиксированном расстоянии над первымтЗдесь необходима корректировка.) Последний также присоединяется так, ->чтобы мы получили фактический наконечник стрелы.

Говоря о наконечниках стрел, в то время какCircleкончиккажется хорошей вещью, они только касаются указанных координат, а не лежат в центре на них. Это может бытьзафиксированный, хотя я бы здесь просто использовал круглые узлы.

Для того, чтобы диаграмма была видна, я краду синтаксис <.>изОтвет Сэма Картераиметьlabelпоявляются одновременно с заполнением узла. Поскольку я использую круглый узел в качестве ориентира вместо наконечника стрелки, узел будет выстраиваться гораздо лучше, по моему мнению.

Мы также могли бы добавить labelк fill, т.е.

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

хотя это заставит картинку прыгать, если только метка больше не будет способствовать ограничивающему фрейму.
Поскольку visible onрешение из overlay-beamer-stylesоставит скрытый текст на рамке (который можно выделить и скопировать), я использую собственный бимер, \uncoverчтобы скрыть текст.

Код

\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}

Вывод (нажмите для полной версии)

Миниатюра к полному файлу

решение2

Вы можете воспользоваться тем фактом, что команды tikz, такие как \draw, поддерживают наложение:

\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}

введите описание изображения здесь

решение3

Используя эту замечательную overlay-beamer-stylesбиблиотеку, вы сможете:

\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}

введите описание изображения здесь

Или вы можете заменить alt={<\it>{-{Circle[]}}{-{Circle[open]}}}на alt={<\it->{-{Circle[]}}{-{Circle[open]}}}(то есть добавить -после \it), если хотите сохранить предыдущие точки заполненными.

Связанный контент