![具有较小值和坐标变换的极坐标图会导致“尺寸过大错误”](https://linux22.com/image/415889/%E5%85%B7%E6%9C%89%E8%BE%83%E5%B0%8F%E5%80%BC%E5%92%8C%E5%9D%90%E6%A0%87%E5%8F%98%E6%8D%A2%E7%9A%84%E6%9E%81%E5%9D%90%E6%A0%87%E5%9B%BE%E4%BC%9A%E5%AF%BC%E8%87%B4%E2%80%9C%E5%B0%BA%E5%AF%B8%E8%BF%87%E5%A4%A7%E9%94%99%E8%AF%AF%E2%80%9D.png)
编辑:由于这似乎是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}