我正在尝试绘制文件中的一些数据,并且想对某一列的值应用自然对数。
梅威瑟:
\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
。我不确定哪个计算引擎更快。