我想使用 向图中添加一串间距均匀的垂直线\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
为了避免的扩展问题\foreach
,pgfplots
提供了\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}