pgfplots:用于刻度、定位等的多个循环

pgfplots:用于刻度、定位等的多个循环

我希望绘制一些(简单)函数,并对特定点值执行一些绘制。下面是一个看起来像我想要的示例(忽略输出中的 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}

相关内容