键 /pgfplots/ymax 的奇怪行为

键 /pgfplots/ymax 的奇怪行为

我有以下代码:

\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中的规范,节点仍然可以正常工作,但是在定义宏时会出现错误:axisaddplot\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}

在此处输入图片描述

相关内容