我希望绘制一些(简单)函数,并对特定点值执行一些绘制。下面是一个看起来像我想要的示例(忽略输出中的 lorem ipsum):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,xmax=100,
ymin=0,ymax=10,
xtick={10,30,85},
ytick=\empty,
xticklabels={a,b,c},
yticklabels=\empty,
xlabel=Something,
ylabel=Something else]
\addplot+[domain=0:100,samples=1000,no markers]{sqrt(x)};
\draw[->] (axis cs:10,0) |- (axis cs:0,{sqrt(10)});
\draw[->] (axis cs:30,0) |- (axis cs:0,{sqrt(30)});
\draw[->] (axis cs:85,0) |- (axis cs:0,{sqrt(85)});
% \foreach \freq in {10,30,85} {
% \draw[->] (axis cs:\freq,0) |- (axis cs:0,{sqrt(\freq)});
% }
\end{axis}
\end{tikzpicture}
\end{document}
我本以为上面代码中注释掉的循环与前面三行代码相同,但它却崩溃了,出现了“未定义的控制序列”错误,我猜想语法是不允许的。这样对吗?有什么解决办法吗?
请注意,在理想世界中,我甚至想要更多:定义一次 x 值,从中计算 y 值,并多次使用这些值,例如设置 y 刻度的位置并通过 (x,f(x)) 坐标绘制定位的内容。这可能意味着必须跨越轴环境的边界。
顺便提一下(但老实说,我还没有阅读手册),我想对齐 x 刻度的基线(看着“b”,我怀疑它们此刻固定在北边)。
答案1
环境内的循环axis
可能有点棘手,请阅读手册中的讨论(我想是第 8 章)。使用\pgfplotsinvokeforeach
比更可预测,但可能不太灵活\foreach
。不是定义宏(\freq
在您的情况下),而是#1
表示变量。
对于刻度标签,添加typeset ticklabels with strut
到轴选项。
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,xmax=100,
ymin=0,ymax=10,
xtick={10,30,85},
ytick=\empty,
xticklabels={a,b,c},
yticklabels=\empty,
xlabel=Something,
ylabel=Something else,
typeset ticklabels with strut]
\addplot+[domain=0:100,samples=1000,no markers]{sqrt(x)};
\pgfplotsinvokeforeach{10,30,85}{
\draw[->] (axis cs:#1,0) |- (axis cs:0,{sqrt(#1)});
}
\end{axis}
\end{tikzpicture}
\end{document}