对从文件读取的列应用日志

对从文件读取的列应用日志

我正在尝试绘制文件中的一些数据,并且想对某一列的值应用自然对数。

梅威瑟:

\documentclass[a4paper,12pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}

\begin{document}
\begin{tikzpicture}
    \begin{axis}
     \addplot+ table [x expr=\thisrowno{0}, y expr=\ln{\thisrowno{1}}]{data.txt};
    \end{axis}
\end{tikzpicture}
\end{document}

所以问题就出在这部分(即如何在一列上应用 ln()):

y expr=\ln{\thisrowno{1}}

我也尝试过使用 \log{}。pgfplots 手册对此也没有太多说明。

有任何想法吗?

答案1

您想要y expr=ln(\thisrowno{1})(注意括号并且没有反斜杠ln)。

括号是pgf数学函数的标准用法(例如sin(x)cos(x))。在键值表达式中,花括号仅用于保护某些内容和界定宏参数。同样,当我们想要时,使用\ln\sin、等(在数学模式下)\cos排版该功能。对于计算使用引擎的函数pgfmath,反斜杠被省略。

这是完整的示例代码(我创建了自己的简单数据文件):

\documentclass[a4paper,12pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}

\usepackage{filecontents}
\begin{filecontents*}{datapaul.txt}
 1 1
 2 2
 3 3
 4 4
 5 5
\end{filecontents*}

\begin{document}
\begin{tikzpicture}
    \begin{axis}
     \addplot+ table [x expr=\thisrowno{0}, y expr=ln(\thisrowno{1})]{datapaul.txt};
     \addplot {ln(x)}; % just for test
    \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

基于的答案expl3,因为这就是我正在研究的。我对 PGF 不太熟悉 :)

\documentclass[a4paper,12pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}

\usepackage{filecontents}
\begin{filecontents*}{data.txt}
 1 1
 2 2
 3 3
 4 4
 5 5
\end{filecontents*}

\usepackage{expl3}
\ExplSyntaxOn
\cs_new_nopar:Npn \NaturalLog #1
 { \fp_eval:n { ln (#1) } }
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}
    \begin{axis}
     \addplot+ table [x expr=\thisrowno{0}, y expr=\NaturalLog{\thisrowno{1}}]{data.txt};
    \end{axis}
\end{tikzpicture}
\end{document}

纯 PGF 答案应该是首选,但这个答案可能对已经在使用的更复杂的操作有用expl3。我不确定哪个计算引擎更快。

相关内容