
У меня есть изображение tikz, которое содержит точки данных (показана только часть)
\documentclass{article}
\usepackage{pgfplots}
\newlength\figureheight
\newlength\figurewidth
\setlength{\figurewidth}{8cm}
\setlength{\figureheight}{4.5cm}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
/pgf/number format/.cd,
use comma,
1000 sep={},
width=0.951\figurewidth,
height=\figureheight,
at={(0\figurewidth,0\figureheight)},
scale only axis,
xmin=-1,
xmax=1,
xlabel style={font=\color{white!15!black}},
xlabel={xlabel},
ymin=0,
ymax=1,
ylabel style={font=\color{white!15!black}},
ylabel={ylabel},
axis background/.style={fill=white}
]
\addplot [color=black, forget plot]
table[row sep=crcr]{%
-1 0\\
-0.987 0.001\\
-0.823 0.15\\
-0.713 0.4\\
-0.684 0.5\\
-0.542 0.6\\
-0.478 0.65\\
-0.3544 0.7\\
-0.254 0.8\\
-0.14 0.9\\
0 1\\
0.057774545 0.9\\
0.15794 0.8\\
0.258105455 0.7\\
0.358270909 0.65\\
0.458436364 0.6\\
0.558601818 0.5\\
0.658767273 0.4\\
0.758932727 0.15\\
0.859098182 0.05\\
0.959263636 0.001\\
1 0\\
};
\end{axis}
\end{tikzpicture}
\end{document}
Данные генерируются на основе измерений и не могут быть (легко) подогнаны под одну функцию или, по крайней мере, я хотел бы этого избежать.
Есть ли хороший способ анимировать (построить линейный график) данные пошагово или блоками по n точек?
Я хотел бы избежать ручной генерации
Изображение-01
\addplot [color=black, forget plot]
table[row sep=crcr]{%
-1 0\\
%-0.987 0.001\\
%-0.823 0.15\\
%-0.713 0.4\\
%-0.684 0.5\\
%-0.542 0.6\\
...
};
Изображение-02
\addplot [color=black, forget plot]
table[row sep=crcr]{%
-1 0\\
-0.987 0.001\\
%-0.823 0.15\\
%-0.713 0.4\\
%-0.684 0.5\\
%-0.542 0.6\\
...
};
и т. д. для того, чтобы зациклить эти изображения. Я бы предпочел автоматизированное решение.
Я бы использовал класс beamer и компилировал с помощью XeLaTeX, если бы эта информация имела значение.
решение1
Анимация со beamer
встроенными инструментами:
Макрос select был заимствован изhttps://tex.stackexchange.com/a/199396/36296
\documentclass{beamer}
\usepackage{pgfplots}
\newlength\figureheight
\newlength\figurewidth
\setlength{\figurewidth}{8cm}
\setlength{\figureheight}{4.5cm}
% Style to select only points from #1 to #2 (inclusive)
\pgfplotsset{select coords between index/.style 2 args={
x filter/.code={
\ifnum\coordindex<#1\def\pgfmathresult{}\fi
\ifnum\coordindex>#2\def\pgfmathresult{}\fi
}
}}
\makeatletter
\newcommand{\slide}{\the\beamer@slideinframe}
\makeatother
\begin{document}
\begin{frame}
\animate<1-22>
\transduration<1-22>{0.5}
\begin{tikzpicture}
\begin{axis}[%
/pgf/number format/.cd,
use comma,
1000 sep={},
width=0.951\figurewidth,
height=\figureheight,
at={(0\figurewidth,0\figureheight)},
scale only axis,
xmin=-1,
xmax=1,
xlabel style={font=\color{white!15!black}},
xlabel={xlabel},
ymin=0,
ymax=1,
ylabel style={font=\color{white!15!black}},
ylabel={ylabel},
axis background/.style={fill=white}
]
\addplot [color=black, forget plot,select coords between index={0}{\slide}]
table[row sep=crcr]{%
-1 0\\
-0.987 0.001\\
-0.823 0.15\\
-0.713 0.4\\
-0.684 0.5\\
-0.542 0.6\\
-0.478 0.65\\
-0.3544 0.7\\
-0.254 0.8\\
-0.14 0.9\\
0 1\\
0.057774545 0.9\\
0.15794 0.8\\
0.258105455 0.7\\
0.358270909 0.65\\
0.458436364 0.6\\
0.558601818 0.5\\
0.658767273 0.4\\
0.758932727 0.15\\
0.859098182 0.05\\
0.959263636 0.001\\
1 0\\
};
\end{axis}
\end{tikzpicture}
\pause[20]
\end{frame}
\end{document}
решение2
Вот анимация некоторых точек данных из таблицы. Для анимации я используюanimate
-упаковка.
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{animate}
\usepackage{tikz}
\begin{filecontents}{mydata.data}
X Y
0 2
1 4
2 2
3 5
4 4
5 1
\end{filecontents}
\begin{document}
\begin{animateinline}{2}% frames per second
\multiframe{5}{ix=1+1}{% the +1 is the step size
\begin{tikzpicture}
\begin{axis}[
xlabel={X-Name},
ylabel={Y-Name},
xmin=0, xmax=5,
ymin=1, ymax=5,
]
\addplot[restrict x to domain=0:\ix,red] table [x index=0,y index=1]{mydata.data};
\end{axis}
\end{tikzpicture}
}
\end{animateinline}
\end{document}
Результат (начальный и конечный вид анимации):
Требования к анимации:
- pdfTEX, версия >= 1.20 или LuaTEX для прямого вывода PDF
- Ghostscript, версия >= 9.15 или Adobe Distiller для преобразования PS в PDF
- dvipdfmx, версия >= 20080607 для преобразования DVI в PDF
- Acrobat Reader (версия >= 7), PDF-XChange, Foxit Reader
Редактировать:
Для последующего зацикливания изображений можно установить опцию loop
для animate
-package \usepackage[loop]{animate}
:.
решение3
Так как ОП использует стандартarticle
класс, который не предоставляет возможности пошагового выполнения beamer
, в этом примере пакет используется animate
для создания анимированного графика на одной странице документа (используя код samcarter с небольшими изменениями):
\documentclass{article}
\usepackage{pgfplots}
\usepackage{animate}
\newlength\figureheight
\newlength\figurewidth
\setlength{\figurewidth}{8cm}
\setlength{\figureheight}{4.5cm}
% Style to select only points from #1 to #2 (inclusive)
\pgfplotsset{select coords between index/.style 2 args={
x filter/.code={
\ifnum\coordindex<#1\def\pgfmathresult{}\fi
\ifnum\coordindex>#2\def\pgfmathresult{}\fi
}
}}
\begin{document}
\begin{animateinline}[controls]{2} % 2 frames per sec
\multiframe{22}{idx=1+1}{ % 22 frames for 22 line segments
\begin{tikzpicture} % idx=1, 2, ..., 22
\begin{axis}[%
/pgf/number format/.cd,
use comma,
1000 sep={},
width=0.951\figurewidth,
height=\figureheight,
at={(0\figurewidth,0\figureheight)},
scale only axis,
xmin=-1,
xmax=1,
xlabel style={font=\color{white!15!black}},
xlabel={xlabel},
ymin=-0.1,
ymax=1,
ylabel style={font=\color{white!15!black}},
ylabel={ylabel},
axis background/.style={fill=white}
]
\addplot [
color=black, forget plot,select coords between index={0}{\idx},
unbounded coords=jump
] table[row sep=crcr]{%
-1 0\\
-0.987 0.001\\
-0.823 0.15\\
-0.713 0.4\\
-0.684 0.5\\
-0.542 0.6\\
-0.478 0.65\\
-0.3544 0.7\\
-0.254 0.8\\
-0.14 0.9\\
0 1\\
0.057774545 0.9\\
0.15794 0.8\\
0.258105455 0.7\\
0.358270909 0.65\\
0.458436364 0.6\\
0.558601818 0.5\\
0.658767273 0.4\\
0.758932727 0.15\\
0.859098182 0.05\\
0.959263636 0.001\\
1 0\\
};
\end{axis}
\end{tikzpicture}
}
\end{animateinline}
\end{document}