我有以下代码:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgflibrary{fixedpointarithmetic}
\usepackage{fp}
\begin{document}
\begin{tikzpicture}[fixed point arithmetic]
\begin{axis}[clip=false,ymax=3e7]
\addplot {1000000*x^2} node {\pgfkeysvalueof{/pgfplots/ymax}};
\pgfmathsetmacro{\maxexponent}{round(log10(\pgfkeysvalueof{/pgfplots/ymax}))}
\node at (axis cs:0,1.5e7) {\maxexponent};
\end{axis}
\end{tikzpicture}
\end{document}
给出了正确的结果
但是,如果我删除环境ymax
中的规范,节点仍然可以正常工作,但是在定义宏时会出现错误:axis
addplot
\maxexponent
! FP error: Logarithm of zero!.
并且中心节点变成0.0
。
为什么密钥的行为会有所不同/pgplots/ymax
?(在 Jake 的评论中回答)
编辑
我问这个问题是因为我想使用ymax
自动确定的值pgfplots
。因此,我将问题更新为:“我如何记录 的值,ymax
以便在相同环境中使用它axis
(根据 Jake 的评论,我认为这是不可能的)或在后续环境中使用它?”
答案1
pgfplots
是基于 TikZ/PGF 构建的,但它在将 PDF 路径绘制对象留给 PGF 之前花费了巨大的精力。因此,它需要首先收集绘图,处理它们,查看它们是否是这样的,需要多少空间,最高点和最低点是什么,以便引入自动轴缩放等。
因此,当您请求该ymax
值时,它尚未确定,默认情况下它为零。因此零的对数会导致错误。
由于您只需要使用值而不是复杂的内容,因此您只需在 PGFPlots 完成轴创建时请求该值即可。这(粗略地说)对应于after end axis
评估点选项。因此,您的代码可以按如下方式修改
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgflibrary{fixedpointarithmetic}
\usepackage{fp}
\begin{document}
\begin{tikzpicture}[fixed point arithmetic]
\begin{axis}[clip=false,
after end axis/.code={
\pgfmathsetmacro{\maxexponent}{round(log10(\pgfkeysvalueof{/pgfplots/ymax}))}
\node[left] at (a) {\pgfmathprintnumber[sci,sci precision=3]{\pgfkeysvalueof{/pgfplots/ymax}}};
\node at (axis cs:0,1.5e7) {\maxexponent};
}
]
\addplot {1000000*x^2} coordinate (a);
\end{axis}
\end{tikzpicture}
\end{document}