看起来,当我尝试缩放坐标数据时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。要使用,必须使用log10
axis 选项log basis y=10
\begin{axis}[ymode=log,log basis y=10] ... \end{axis}
另外,log (ab/cd) =log a+ log b -log c- log d
OP 的过滤器代码不正确
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}