在 pgfplots 中将图剪切到其他图

在 pgfplots 中将图剪切到其他图

我正在使用给定的 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--plotclipplotaxis 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}

相关内容