
Мне нужен прямоугольник с 80 диагональными линиями:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
%------------------------
%% Options
%------------------------
width= 100mm,
%height = 50mm,
xmax=70,
xmin=0,
ymax=50,
ymin=0,
axis x line=bottom,
axis y line=left,
enlargelimits
]
%------------------------
%% Define Clipping
%------------------------
\pgfplotsextra{%
\clip (axis cs:0,0) rectangle (axis cs:60,40);
% http://www.latex-community.org/forum/viewtopic.php?f=45&t=22837&start=0
}
%------------------------
%% Loop
%------------------------
\foreach \i in {1,2,...,80} {
\addplot[
domain=0:60,
line width=1pt,
]
{4/6*x+40-\i};
}
%------------------------
%% Draw retangle
%------------------------
\draw[red,line width=2pt] (axis cs:0,0) rectangle (axis cs:60,40);
\end{axis}
\end{tikzpicture}
\end{document}
Теперь у меня есть файл данных, который выглядит так:
4, % Line 1 is the top left corner
5,
50,
51,
52,
6,
7,
8,
9,
10,
22,
...
Теперь я хочу, чтобы 80 строк появились в анимированной анимации в этом порядке строка за строкой. Я вручную сделал анимированный gif, чтобы показать желаемый вывод:
Но отсюда у меня нет правильного представления, как действовать дальше.
Решение от Джейка
Спасибо за ответы! Я принимаю ответ Джейка, потому что он использует внешний файл, что для меня важно. Мой реальный пример содержит более 1200 строк. Вот решение (в ответе Джейка отсутствует окружение filecontents):
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{animate}
\usepackage{filecontents}
\begin{filecontents}{index.dat}
4,
5,
50,
51,
52,
6,
7,
8,
9,
10,
22,
\end{filecontents}
\begin{document}
\pgfplotstableread[col sep=comma]{index.dat}\indextable
\begin{animateinline}[controls]{2}
\multiframe{11}{imax=0+1}{
\begin{tikzpicture}
\begin{axis}[
%------------------------
%% Options
%------------------------
width= 100mm,
%height = 50mm,
xmax=70,
xmin=0,
ymax=50,
ymin=0,
axis x line=bottom,
axis y line=left,
enlargelimits
]
%------------------------
%% Define Clipping
%------------------------
\pgfplotsextra{%
\clip (axis cs:0,0) rectangle (axis cs:60,40);
% http://www.latex-community.org/forum/viewtopic.php?f=45&t=22837&start=0
}
%------------------------
%% Loop
%------------------------
\foreach\i in {0,...,\imax}{
\pgfplotstablegetelem{\i}{[index]0}\of{\indextable}
\edef\currentindex{\pgfplotsretval}
\addplot[
domain=0:60,
line width=1pt,
]
{4/6*x+40-\currentindex};
}
%------------------------
%% Draw retangle
%------------------------
\draw[red,line width=2pt] (axis cs:0,0) rectangle (axis cs:60,40);
\end{axis}
\end{tikzpicture}}
\end{animateinline}
\end{document}
Вот результат:
решение1
Вы можете прочитать файл данных, содержащий упорядоченные значения, в макрос таблицы PGFPlots, а затем выполнить цикл по нему в animateinline
среде:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{animate}
\usepackage{filecontents}
\begin{document}
\pgfplotstableread[col sep=comma]{index.dat}\indextable
\begin{animateinline}{2}
\multiframe{10}{imax=0+1}{
\begin{tikzpicture}
\begin{axis}[
%------------------------
%% Options
%------------------------
width= 100mm,
%height = 50mm,
xmax=70,
xmin=0,
ymax=50,
ymin=0,
axis x line=bottom,
axis y line=left,
enlargelimits
]
%------------------------
%% Define Clipping
%------------------------
\pgfplotsextra{%
\clip (axis cs:0,0) rectangle (axis cs:60,40);
% http://www.latex-community.org/forum/viewtopic.php?f=45&t=22837&start=0
}
%------------------------
%% Loop
%------------------------
\foreach\i in {0,...,\imax}{
\pgfplotstablegetelem{\i}{[index]0}\of{\indextable}
\edef\currentindex{\pgfplotsretval}
\addplot[
domain=0:60,
line width=1pt,
]
{4/6*x+40-\currentindex};
}
%------------------------
%% Draw retangle
%------------------------
\draw[red,line width=2pt] (axis cs:0,0) rectangle (axis cs:60,40);
\end{axis}
\end{tikzpicture}}
\end{animateinline}
\end{document}
решение2
Это работает с проектором. Петля снаружи axis
.
\documentclass{beamer}
\usepackage{tikz}
\usepackage{pgfplots}
\tikzset{
invisible/.style={opacity=0},
visible on/.style={alt={#1{}{invisible}}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\foreach \i [count=\j] in {4,5,50,51,52,6,7} {
\begin{axis}[
%------------------------
%% Options
%------------------------
width= 100mm,
%height = 50mm,
xmax=70,
xmin=0,
ymax=50,
ymin=0,
axis x line=bottom,
axis y line=left,
enlargelimits
]
%------------------------
%% Define Clipping
%------------------------
\pgfplotsextra{%
\clip (axis cs:0,0) rectangle (axis cs:60,40);
% http://www.latex-community.org/forum/viewtopic.php?f=45&t=22837&start=0
}
%------------------------
%% Draw retangle
%------------------------
\draw[red,line width=2pt] (axis cs:0,0) rectangle (axis cs:60,40);
\addplot[
domain=0:60,
line width=1pt, visible on=<\j->]
{4/6*x+40-\i};
\end{axis}}
\end{tikzpicture}
\end{frame}
\end{document}
Позже я сделаю гифку и добавлю еще немного информации.
решение3
Это попытка, в которой список порядка может быть изменен для большей гибкости. App
— это команда, которая принимает два аргумента: #1= # кадров и #2= порядок рисования линий. Помните, что #1 \multiframe{#1}
должен быть последним в App
списке.
Сама команда App
представляет собой цикл whiledo, рисующий недиагональные линии.
Пожалуйста, вырежьте и вставьте, чтобы показать, как происходит анимация.
Код
\documentclass[border=10pt]{standalone}
\usepackage{animate}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\newcounter{n}
\setcounter{n}{01}
\newcommand{\App}[2]{
\whiledo{\value{n}=#1 \and \icount=#1}{
\stepcounter{n} % #1= # of frame
\foreach \i in {#2} { % #2=list
\addplot[
domain=0:60,
line width=1pt,
]
{4/6*x+40-\i};
}}}
\begin{document}
%\begin{center}
\begin{animateinline}[loop,poster =first, controls]{1}
\multiframe{10}{icount=0+1}
{
\begin{tikzpicture}
\begin{axis}[
%------------------------
%% Options
%------------------------
width= 100mm,
%height = 50mm,
xmax=70,
xmin=0,
ymax=50,
ymin=0,
axis x line=bottom,
axis y line=left,
enlargelimits
]
%------------------------
%% Define Clipping
%------------------------
\pgfplotsextra{%
\clip (axis cs:0,0) rectangle (axis cs:60,40);
% http://www.latex-community.org/forum/viewtopic.php?f=45&t=22837&start=0
}
%------------------------
%% Loop
%------------------------
\App{1}{4}
\App{2}{4,5}
\App{3}{4,5,50}
\App{4}{4,5,50,51}
\App{5}{4,5,50,51,52}
\App{6}{4,5,50,51,52,6}
\App{7}{4,5,50,51,52,6,7,8}
\App{8}{4,5,50,51,52,6,7,8,9}
\App{9}{4,5,50,51,52,6,7,8,9,10}
\App{10}{4,5,50,51,52,6,7,8,9,10,22}
%------------------------
%% Draw retangle
%------------------------
\draw[red,line width=2pt] (axis cs:0,0) rectangle (axis cs:60,40);
\end{axis}
\end{tikzpicture}
}
\end{animateinline}
%\end{center}
\end{document}