正确引用 pgfplots 轴中的程序节点?(不知道形状,格式不正确的浮点数......)

正确引用 pgfplots 轴中的程序节点?(不知道形状,格式不正确的浮点数......)

这会是一个稍微混乱/不清楚的问题,但是我可以回答一下。

基本上,我想使用中的图pgfplots,其中我还想以编程方式生成一些节点(可能是与图相交的结果);然后填充图和可能从相交节点派生的节点之间的区域。

我基本上让 MWE 工作了(如下);我将尝试解释工作流程:

  • 我从一个函数图(此处sin(x))和一组点(此处\xPoints)开始,这些点是预定义的 x 坐标
  • 我想从 开始画出垂直线\xPoints,找到与 的交点sin(x),并将这些点存储为节点。这不是这里的问题,所以我完全避免使用交点 - 作为这些节点的替代,我使用节点(tnode\i)(蓝色),其 x 位置为\xPoints,y 位置任意
  • 我想基于 以编程方式生成第二组节点(tnode\i)。在本例中,这些是(txnode\i)节点 (红色),它们只是(tnode\i)节点位置,但它们的 y 位置更改为(tnode\i).y+\i*2.0;其中\i是节点的索引 ( 允许count)。因此, 的位置(txnode\i)取决于相应(tnode\i)元素位置和索引本身。
  • 基于第二组节点,(txnode\i)我想派生出第三组点,使得它们的.x相同,并且它们的.y再次是一个公式(txnode\i).y+0.7(在这种特殊情况下,它不使用索引count,但一般情况下可能会使用 - 因此需要在中旋转\foreach)。
  • 第三组点不需要显示/渲染为节点,但它将用于填充区域,位于第三组点和绘图函数相应部分之间sin(x)

MWE 生成此图像:

测试_pdf

...存在以下问题:

  • 如果我不使用\pgfplotsextra,我就不能使用\gettikzxy\foreach错误:“没有名为”的形状......“已知”)
  • (如果不想使用\pgfplotsforeachungrouped——它似乎没有[count=,我需要它来生成节点名称)
  • 如果我确实使用了\pgfplotsextra,我不能使用像由提供的domain=\x:\upx东西\x,因为那样我会得到“......格式错误的浮点数‘97.191’”(这更奇怪,因为‘97.191’、‘0.0’等应该\upx\foreach不是是格式不正确的浮点数吗?
  • 我可以尝试运行该\foreach代码-\pgfplotsextra但是我又不能使用\gettikzxy里面了,因为我会再次收到“没有命名形状”的错误;但是,如果我只是直接在命令中引用该节点\addplot,那么它就可以起作用了???!

显然,最后的解决方案对我来说不太合适,因为我想根据节点来计算东西(就像在“%\temp%问题行...”附近的代码片段中显示的那样)。

所以,我的问题是 - 如何编写代码,以便最终我可以获得对txnode\i节点(图像上的红色节点)的引用,基于它们计算一些坐标,并在中使用这些计算\addplot

下面是代码:

\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/33703/86}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{intersections} %% named intersections
\usetikzlibrary{calc}

\makeatletter
% http://tex.stackexchange.com/questions/33703/extract-x-y-
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother


\begin{document}

\def\xPoints{0.0,0.625,1.25,1.875,2.5,3.125,3.75,4.375}

\begin{tikzpicture}
\begin{axis}[ymin = 0, ymax = 2]

  \addplot[blue,domain=0:3.1] {sin(deg(x))}; % must have

  \foreach [count=\i] \x in \xPoints {
    \edef\temp{
      \noexpand\node [draw,blue] (tnode\i) at ({axis cs:\x,1.0}) {} ;
    }
    \temp
  }


  \pgfplotsextra{ % must have, else Package pgf Error: "No shape named" txnode1 "is known" for gettikzxy

    \newlength{\tl}
    \foreach [count=\i] \x in \xPoints {
      \gettikzxy{(tnode\i)}{\tix}{\tiy}
      \pgfmathsetmacro{\newy}{\tiy+\i*2.0}
      \setlength{\tl}{\newy pt}
      \edef\temp{
        \noexpand\node [draw,red] (txnode\i) at ({axis cs:\x,0}|-{0,\tl}) {} ;
      }
      \temp
    } % \foreach

    \foreach [count=\i] \x
        [evaluate=\x as \upx using (\x+0.1)]
    in \xPoints {
      \gettikzxy{(txnode\i)}{\tix}{\tiy}
      \pgfmathsetmacro{\newy}{\tiy+0.7}
      \setlength{\tl}{\newy pt}
      \edef\temp{
        \noexpand\addplot[color=blue!50,restrict x to domain=\x:\upx,domain=\x:\upx]
        plot[fill] {sin(deg(x))} |- ({axis cs:\x,0}|-{0,\tl}) -- cycle;
      }
      %\temp % the problem line - generates:
      %! Package PGF Math Error: Sorry, an internal routine of the floating point unit
      % got an ill-formatted floating point number `97.191'. The unreadable part was n
      %ear '97.191'..
    } % \foreach

  } % \pgfplotsextra


  % seems to work here:
  \foreach [count=\i] \x
      [evaluate=\x as \upx using (\x+0.1)]
  in \xPoints {
    %\gettikzxy{(txnode\i)}{\tix}{\tiy} % No shape named txnode1 is known.
    %\pgfmathsetmacro{\newy}{\tiy+0.7}
    %\setlength{\tl}{\newy pt}
    %\edef\temp{
    %  \noexpand\addplot[color=blue!50,restrict x to domain=\x:\upx,domain=\x:\upx]
    %  plot[fill] {sin(deg(x))} |- ({axis cs:\x,0}|-{0,\tl}) -- cycle;
    %}
    % this works, though?
    \edef\temp{
      \noexpand\addplot[color=blue!50,restrict x to domain=\x:\upx,domain=\x:\upx]
      plot[fill] {sin(deg(x))} |- (txnode\i) -- cycle;
    }
    \temp
  } % \foreach

\end{axis}
\end{tikzpicture}

\end{document}

相关内容