我想使用绘制自定义函数pgfplots
,并添加注释节点:
\begin{tikzpicture}[
>=stealth,
evaluate={
function f(\x) {
return cos(2*\x);
};
}
]
\begin{axis}[
axis lines=middle,
xtick=\empty,
ytick=\empty,
xmin=-200,
xmax=200,
ymin=-1.5,
ymax=1.5
]
\addplot[
domain=-180:180,
samples=361
]{f(x)};
% \node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
\end{axis}
\end{tikzpicture}
结果是:
我的问题是关于上面注释的行,它无法正确编译。在我看来,原因可能与函数求值过程有关(例如f
上面的函数)。我不太了解它的机制,所以有什么办法可以解决这个问题吗?如果能多加解释就更好了!
顺便说一句:除了evaluate
,我还尝试了declare function
,它在这种情况下工作得很好;但实际的自定义函数涉及一个复杂的表达式(以递归方式定义), 可能无法处理declare function
。
答案1
你评论的代码做只要你加载math
库就可以工作。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{math}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[
>=stealth,
evaluate={
function f(\x) {
return cos(2*\x);
};
}
]
\begin{axis}[
axis lines=middle,
xtick=\empty,
ytick=\empty,
xmin=-200,
xmax=200,
ymin=-1.5,
ymax=1.5
]
\addplot[
domain=-180:180,
samples=361
]{f(x)};
\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
%\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
\end{axis}
\end{tikzpicture}
\end{document}
但请注意,与在图中充分利用的库math
结合可能并非易事。也就是说,如果您想使用处理整数的递归函数,您可能需要在本地关闭。fpu
pgfplots
fpu
至于评论中的问题:包含此代码并使用的文档存在问题xelatex
或lualatex
运行问题beamer
metropolis
。讨论了一个可能相关的问题这里。除其他事项外,metropolis
将的版本设置pgfplots
为值1.9
。这是该星座的临时解决方法。您需要为该函数选择一个不同的变量(当然,这只是一个占位符,但这绝对不是必要的)。也就是说,使用
evaluate={
function f(\t) {
return cos(2*\t);
};
}
其中\x
被 替换\t
。完整代码:
\documentclass{beamer}
\usetheme{metropolis}
\usepackage{pgfplots}
\usetikzlibrary{math}
\begin{document}
\pgfplotsset{compat=1.17}
\begin{frame}[t,fragile]
\frametitle{}
\begin{tikzpicture}[
>=stealth,
evaluate={
function f(\t) {
return cos(2*\t);
};
}
]
\begin{axis}[
axis lines=middle,
xtick=\empty,
ytick=\empty,
xmin=-200,
xmax=200,
ymin=-1.5,
ymax=1.5
]
\addplot[%variable=\t,
domain=-180:180,
samples=361
]{f(x)};
\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,{f(45)}) {};
%\node[coordinate,pin=above right:{$\cos 2x$}] at (axis cs:45,0) {};
\end{axis}
\end{tikzpicture}
\end{frame}
\end{document}