我正在使用给定的 MWE 绘制如下所示的凸框架。在这个框架内,我们的想法是绘制其他函数来创建图像。为了避免手动计算框架内每个函数的域限制,最好将这些函数简单地剪辑(或以其他方式限制)到我的自定义框架中。(在下面的示例中,这意味着虚线曲线不应超出框架。)有人知道一个巧妙的方法来做到这一点吗?
如您所见,我尝试使用交集,但找不到好的解决方案。我已将名称定义保留在 MWE 中,以防您发现它们有用。
\documentclass[tikz]{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{pgfplots.polar,intersections}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=50,smooth,thick,axis lines=none]
% frame
\addplot[domain=45:135]{(4/sin(x))/(1+0.01*(4/sin(x))^2)};
\addplot[domain=225:315]{(-4/sin(x))/(1+0.01*(-4/sin(x))^2)};
\addplot[domain=-45:45]{(4/cos(x))/(1+0.01*(4/cos(x))^2)};
\addplot[domain=135:225]{(-4/cos(x))/(1+0.01*(-4/cos(x))^2)};
% image plot example
\addplot[dotted,domain=30:150]{(3/sin(x))/(1+0.01*(3/sin(x))^2)};
\end{polaraxis}
\end{tikzpicture}
\end{document}
编辑:我忘记对分数中的最后一个项进行平方,结果发现这给 Fritz 原本很棒的解决方案带来了问题。当在 Fritz 的示例中使用正确的函数时,路径会被完全忽略,大概是因为tikz
无法处理数学表达式。pgfplots
但是,它们在图中工作得很好。还有其他没有这个问题的解决方案吗?
抱歉,我犯了个错误!请原谅我的心不在焉。
答案1
除了使用 绘制框架之外,您还可以使用和操作\addplot
创建描述相同形状的 TikZ 路径。这允许您使用键将当前范围内的所有绘图限制在路径描述的区域中。为了将 TikZ操作与 PGFPlots 坐标一起使用,您需要使用坐标系。plot
--plot
clip
plot
axis cs
当范围结束时,剪辑也随之结束,如红色路径所示:
\documentclass[tikz,margin=3pt]{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{pgfplots.polar,intersections}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=50,smooth,thick,axis lines=none]
\begin{scope} % Everything inside this scope is clipped
% frame
\path[clip,draw]
plot[domain=44.9:135] (axis cs: \x, {(4/sin(\x))/(1+0.2*(4/sin(\x)))})
--plot[domain=135:225] (axis cs: \x, {(-4/cos(\x))/(1+0.2*(-4/cos(\x)))})
--plot[domain=225:315] (axis cs: \x, {(-4/sin(\x))/(1+0.2*(-4/sin(\x)))})
--plot[domain=-45:45] (axis cs: \x, {(4/cos(\x))/(1+0.2*(4/cos(\x)))})
--cycle;
% Clipped plot:
\addplot[dotted,domain=30:150]{(3/sin(x))/(1+0.2*(3/sin(x)))};
\end{scope}
% Scope ended, so this is not clipped:
\addplot[red,dotted,domain=20:160]{(2/sin(x))/(1+0.2*(2/sin(x)))};
\end{polaraxis}
\end{tikzpicture}
\end{document}
当对商的第二部分取平方时,它也同样有效:
\documentclass[tikz,margin=3pt]{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{pgfplots.polar,intersections}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=50,smooth,thick,axis lines=none]
\begin{scope} % Everything inside this scope is clipped
% frame
\path[clip,draw]
plot[domain=44.9:135] (axis cs: \x, {(4/sin(\x))/(1+0.01*(4/sin(\x))^2)})
--plot[domain=135:225] (axis cs: \x, {(-4/cos(\x))/(1+0.01*(-4/cos(\x))^2)})
--plot[domain=225:315] (axis cs: \x, {(-4/sin(\x))/(1+0.01*(-4/sin(\x))^2)})
--plot[domain=-45:45] (axis cs: \x, {(4/cos(\x))/(1+0.01*(4/cos(\x))^2)})
--cycle;
% Clipped plot:
\addplot[dotted,domain=30:150]{(3/sin(x))/(1+0.01*(3/sin(x))^2)};
\end{scope}
% Scope ended, so this is not clipped:
\addplot[red,dotted,domain=20:160]{(2/sin(x))/(1+0.01*(2/sin(x))^2)};
\end{polaraxis}
\end{tikzpicture}
\end{document}