pgfplots:在 addplot 中使用 foreach

pgfplots:在 addplot 中使用 foreach

我想使用 向图中添加一串间距均匀的垂直线\foreach

我可以这样做:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}

    \begin{axis}[
        axis lines=left,
        scaled ticks=false,
        xtick=\empty,
        ytick=\empty,
        ymin=0,
    ]

    \addplot[samples=100,domain=0:10] {(x-5)^2 + 20};

    \addplot coordinates {\foreach \x in {1,...,9}  (\x,0) (\x,40)};

    \end{axis}

\end{tikzpicture}

\end{document}  

我得到了以下情节:

在此处输入图片描述

但是,我希望所有的台词都是同一个情节的一部分;就像这样:

\addplot coordinates {\foreach \x in {1,...,9}  (\x,0) (\x,40)};

或这个:

\addplot {\foreach \x in {1,...,9} coordinates (\x,0) (\x,40)};

但是这些都无法编译。是否可以\foreach在 inside使用\addplot,如果可以,正确的语法是什么?

编辑:我希望情节是这样的:

在此处输入图片描述

它是我使用以下代码片段生成的:

\addplot coordinates {
    (1,0) (1,40)

    (2,0) (2,40)

    (3,0) (3,40)

    (4,0) (4,40)
};

但我想使用for-type 循环来完成它。

顺便说一句,我这样做的原因是为了能够将曲线上的线拖到 x 轴并标记它们。我计划让垂直线不可见,然后找到曲线和垂直线的交点,然后使用交点作为从曲线开始的可见线的坐标。如果有更有效的方法来做到这一点(这似乎是一件很常见的事情),我洗耳恭听。编辑:我正在从文件中读取函数,而不是使用公式生成它。

答案1

为了避免的扩展问题\foreachpgfplots提供了\pgfplotsinvokeforeach可以毫无问题地使用的;此外,您还可以使用函数轻松地从曲线到轴绘制线条(无需找到交点);从一开始就声明该函数也可以简化代码:

在此处输入图片描述

代码:

\documentclass[border=5]{standalone}
\usepackage{pgfplots}
%\pgfplotsset{compat=1.12}

\pgfmathdeclarefunction{myfunct}{1}{%
  \pgfmathparse{(#1-5)^2 + 20}%
}

\begin{document}    
\begin{tikzpicture} 
    \begin{axis}[%
        ,axis lines=left
        ,xtick=\empty
        ,ytick=\empty
        ]
        \addplot[samples=100,domain=0:10] {myfunct(x)};
        \pgfplotsinvokeforeach{1,...,9}{
            \addplot coordinates { (#1,0) (#1,40) };}
    \end{axis}  
\end{tikzpicture}\qquad
\begin{tikzpicture} 
    \begin{axis}[%
        ,axis lines=left
        ,xtick=\empty
        ,ytick=\empty
        ]
        \addplot[samples=100,domain=0:10] {myfunct(x)};
        \pgfplotsinvokeforeach{1,...,9}{
            \addplot coordinates { (#1,0) (#1,{myfunct(#1)}) };
            \node[above=5pt] at (axis cs:#1,{myfunct(#1)}) {\pgfmathprint{myfunct(#1)}};
            }
    \end{axis}  
\end{tikzpicture}   

\end{document} 

更新

使用相同的想法,为曲线命名路径并在里面\pgfplotsinvokeforeach画线并命名;找到交点并使用所需的标签绘制所需的线条:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\pgfplotsset{compat=1.10}

\usepackage{filecontents}
\begin{filecontents*}{mydata.dat}
-6 36
-5 25
-4 16
-3 9
-2 4
-1 1
0 0
1 1
2 4
3 9
4 16
5 25
6 36
\end{filecontents*}


\begin{document}

\begin{tikzpicture}

\begin{axis}[
  axis lines=left,
  scaled ticks=false,
  xtick=\empty,
  ytick=\empty,
  ymin=0,
]
\addplot[no marks,smooth,name path=curve] table {mydata.dat};
\pgfplotsinvokeforeach{-6,...,6}{
  \addplot[draw=none,name path={line#1}] coordinates  { (#1,0) (#1,40) };
  \path[name intersections={of=curve and line#1,by={point#1}}];
  \draw[red]
    (axis cs:#1,0) -- (point#1) node[above,black] {#1};
}
\end{axis}

\end{tikzpicture}

\end{document} 

在此处输入图片描述

答案2

正确的语法(或至少是有效的语法)如下所示:

% arara: pdflatex

\documentclass[border=5]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}    
\begin{tikzpicture} 
    \begin{axis}[%
        ,axis lines=left
        ,xtick=\empty
        ,ytick=\empty
        ]
        \addplot[samples=100,domain=0:10] {(x-5)^2 + 20};
        \foreach \x in {1,...,9}
        {\edef\temp{\noexpand\addplot coordinates { (\x,0) (\x,40)};}\temp}
    \end{axis}  
\end{tikzpicture}   
\end{document} 

在此处输入图片描述

答案3

从你问题的最后一段,我了解到你想要这样的东西:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}

    \begin{axis}[
        axis lines=left,
        scaled ticks=false,
        xtick=\empty,
        ytick=\empty,
        ymin=0,
        declare function={myfunction(\t)=(\t-5)^2+20;}
    ]

    \addplot[samples=100,domain=0:10] {myfunction(x)};

    \foreach \x in {1,...,9}
        {\edef\temp{\noexpand\addplot coordinates { (\x,{myfunction(\x)})};}\temp}

     \draw (axis cs:3,{myfunction(3)})--++(90:2cm);
     \draw[red] (axis cs:2,{myfunction(2)})--(axis cs:7,{myfunction(7)});
    \end{axis}

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容