具有较小值和坐标变换的极坐标图会导致“尺寸过大错误”

具有较小值和坐标变换的极坐标图会导致“尺寸过大错误”

编辑:由于这似乎是pgfplots问题中的一个错误,因此已经打开了: https://github.com/pgf-tikz/pgfplots/issues/360

在绘制极轴时,我遇到了使用y coord trafo/y coord inv trafo选项转换小数量时的问题。

我的图基本上是极坐标域中的正弦函数。以下面的例子为余弦cos(3\x)。此函数有正值和负值,并在axis环境中按预期绘制。

在此处输入图片描述

现在如果我们想在polaraxis环境中绘制这个相同的函数,就会得到以下结果:

在此处输入图片描述

基本上,负值被视为 180° 相移,而不是简单地显示为定义角坐标处的负值。

这种行为可以通过一些精心选择的 来规避y coord trafo/y coord inv trafo。在这种情况下,

y coord trafo/.code=\pgfmathparse{#1+2},
y coord inv trafo/.code=\pgfmathparse{#1-2},

工作正常。

在此处输入图片描述

但是,如果必须处理一些较小的值,1e-6例如像上述示例中那样处理振幅而不是 1,则计算会因精度错误而失败。这些问题应该可以通过单元解决fpu,但我无法找出正确的序列。我尝试过例如

y coord trafo/.code={\pgfkeys{/pgf/fpu=true}\pgfmathparse{#1+2e-6}\pgfkeys{/pgf/fpu=false}},
y coord inv trafo/.code={\pgfkeys{/pgf/fpu=true}\pgfmathparse{#1-2e-6}\pgfkeys{/pgf/fpu=false}},

但这会导致非法计量单位错误。

这是在重新激活注释部分后重现图形和问题的 MWE。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepgfplotslibrary{polar}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{axis}
\end{tikzpicture}
\begin{tikzpicture}
    \begin{polaraxis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{polaraxis}
\end{tikzpicture}

\begin{tikzpicture}
    \begin{polaraxis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            y coord trafo/.code=\pgfmathparse{#1+2},
            y coord inv trafo/.code=\pgfmathparse{#1-2},
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{polaraxis}
\end{tikzpicture}

% Not working
% \begin{tikzpicture}
%     \begin{polaraxis}[%
%             xmin=0,
%             xmax=360,
%             ymin=-2e-6,
%             ymax=2e-6,
%             y coord trafo/.code={\pgfmathparse{#1+2e-6}},
%             y coord inv trafo/.code={\pgfmathparse{#1-2e-6}},
%             domain = 0:360,
%         ]
%         \addplot+ ({\x},{1e-6*cos(3*\x)});
%     \end{polaraxis}
% \end{tikzpicture}

\end{document}

答案1

您使用坐标变换的想法fpu很好。您只需添加/pgf/fpu/output format=fixed

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepgfplotslibrary{polar}
\newcommand{\pgfmathparseFPU}[1]{\begingroup%
  \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
  \pgfmathparse{#1}%
  \pgfmathsmuggle\pgfmathresult\endgroup}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{axis}
\end{tikzpicture}
\begin{tikzpicture}
    \begin{polaraxis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{polaraxis}
\end{tikzpicture}

\begin{tikzpicture}
    \begin{polaraxis}[%
            xmin=0,
            xmax=360,
            ymin=-2,
            ymax=2,
            y coord trafo/.code=\pgfmathparse{#1+2},
            y coord inv trafo/.code=\pgfmathparse{#1-2},
            domain = 0:360,
        ]
        \addplot+ ({\x},{cos(3*\x)});
    \end{polaraxis}
\end{tikzpicture}

% Now working
\begin{tikzpicture}
    \begin{polaraxis}[%
            xmin=0,
            xmax=360,
            ymin=-2e-6,
            ymax=2e-6,
            y coord trafo/.code={\pgfmathparseFPU{#1+2e-6}},
            y coord inv trafo/.code={\pgfmathparseFPU{#1-2e-6}},
            domain = 0:360,
        ]
        \addplot+ ({\x},{1e-6*cos(3*\x)});
    \end{polaraxis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容