根据离散数据制作 PGF 图动画

根据离散数据制作 PGF 图动画

我有一张包含数据点的 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 或 Adob​​e Distiller 用于 PS 到 PDF 的转换
  • dvipdfmx,版本 >= 20080607,用于 DVI 到 PDF 的转换
  • Acrobat Reader(版本 >= 7)、PDF-XChange、Foxit Reader

编辑: 为了随后循环播放图像,您可以设置loop-package animate:选项\usepackage[loop]{animate}

答案3

由于 OP 使用标准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}

相关内容