这会是一个稍微混乱/不清楚的问题,但是我可以回答一下。
基本上,我想使用中的图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 生成此图像:
...存在以下问题:
- 如果我不使用
\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}