对数刻度图和过滤器在 pgfplots 中交互不佳

对数刻度图和过滤器在 pgfplots 中交互不佳

看起来,当我尝试缩放坐标数据时pgfplots,我无法简单地以对数尺度进行操作,因为表达式过滤器似乎应用于最终点而不是表值。

例如,我期望这两个命令产生基本相同的图:

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ymode=log] % ymode=normal works well!
\addplot+[] table[
x expr=\thisrow{X}*1., y expr=\thisrow{Y}*3, row sep=\\
]{
X Y \\
1 1.1 \\
2 11 \\
3 110 \\
} node[]{};
\addplot+[x filter/.code={\pgfmathparse{\pgfmathresult*1.}\pgfmathresult}, 
y filter/.code={\pgfmathparse{\pgfmathresult*3.}\pgfmathresult}] 
plot coordinates
{
 ( 1, 1 )
 ( 2, 10)
 ( 3, 100)
};
\end{axis}
\end{tikzpicture}
\end{document}

不管我怎么理解,

错误情节

其中红线(coordinates版本)不是预期结果。例如,最后一个红点约为 10^6,而不是 300。

(使用ymode=normal产生预期的图表)

显然y filter/.code没有达到我的预期。我记得在手册中读到过一些关于此的内容。也许这是设计使然。

问题是:是否有其他方法可以应用此转换,使其适用于线性和对数图(只需更改 的值ymode)?还是我必须plot table完全切换到基于 的代码?

答案1

这是一个可行的解决方案。对于 ymode=log,默认值为自然对数,basis e而不是底数为 10。要使用,必须使用log10axis 选项log basis y=10

\begin{axis}[ymode=log,log basis y=10] ... \end{axis}

另外,log (ab/cd) =log a+ log b -log c- log dOP 的过滤器代码不正确

y filter/.code={\pgfmathparse{\pgfmathresult*3.}\pgfmathresult}

演示的是自然对数,ln;对于log10,需要\pgfmathresult+log10(3)在过滤代码中添加相应的上述技巧。

在此处输入图片描述

代码

\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ymode=log] % ymode=normal works well!
\addplot+[] table[
x expr=\thisrow{X}*1., y expr=\thisrow{Y}*3, row sep=\\
]{
X Y \\
1 1.1 \\
2 11 \\
3 110\\
} node[]{};
\addplot+[%x filter/.code= {\pgfmathparse{\pgfmathresult*1.}\pgfmathresult}, 
y filter/.code= {\pgfmathparse{\pgfmathresult+ln(3)}\pgfmathresult}
] 
plot coordinates
{
 ( 1, 1)
 ( 2, 10)
 ( 3, 100)
};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容