使用 pgfplots' \addplot 创建剪辑路径

使用 pgfplots' \addplot 创建剪辑路径

我一直在尝试重现以下示例

\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}

由此回答。不幸的是,我想要创建的区域涉及无法使用 tikz 的绘图功能正确绘制的函数。我可以使用 pgfplots 的 \addplot 绘制它们,但我不知道如何提取路径并将它们连接到其他点和路径。我的总体目标是绘制轮廓填充区域(也来自 pgfplot)。我将不胜感激任何指导或帮助。

编辑:我想将点 (-0.66,2) 连接到路径

\addplot[domain=-0.66:0, clip = true] {-2*x*(x^2 + sqrt(1+ x^4))};

这条路

\addplot[domain=0:2] {2*x*(-x^2 + sqrt(1+ x^4))}; 

然后,将此路径移动到(2,2)并循环到(-0.66,2)然后使用范围内的区域来裁剪填充的轮廓。

答案1

事实上,这并不是什么大问题,而且Z 完全有能力绘制这些函数。

您只需注意一件事:由于某些神秘的机制,\x如果您希望它取要指数化的负值,则需要用括号括起来。因此,如果可能为负数,则应写为(\x)^2而不是。但这仅适用于Ti 中的函数\x^2\xplotZ。

我猜你可能不想要极轴:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=100, smooth, axis lines=none]

\begin{scope} 
\path[clip]
    (-0.66,2) -- 
    plot[domain=-0.66:0] (axis cs: \x, {-2*\x*((\x)^2 + sqrt(1+(\x)^4))}) -- 
    plot[domain=0:2] (axis cs: \x, {2*\x*(-\x^2 + sqrt(1+\x^4))}) -- 
    (2,2) -- cycle;
\fill[red] (-1,5) rectangle (10,-10);
\end{scope}

\addplot[domain=-0.66:0] {-2*x*(x^2 + sqrt(1+ x^4))};
\addplot[domain=0:2] {2*x*(-x^2 + sqrt(1+ x^4))}; 

\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述


另一种方法是使用fillbetween库。这样,您就不需要将所有内容绘制两次。

由于这两条路径实际上并不相交(仅在一个点相交,这一点很容易被 Ti 忽略)。Z(由于舍入误差),我们应该在序列定义中使用整个路径,使用L*R*而不是交集段:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=100, smooth, axis lines=none]

\addplot[domain=-0.66:0, name path=A] {-2*x*(x^2 + sqrt(1+ x^4))};
\addplot[domain=0:2, name path=B] {2*x*(-x^2 + sqrt(1+ x^4))}; 

\begin{scope} 
\path[clip, intersection segments={of=A and B, 
    sequence={L* -- R*}}] -- (2,2) -- (-0.66,2) -- cycle;
\fill[red] (-1,5) rectangle (10,-10);
\end{scope}

\end{axis}
\end{tikzpicture}
\end{document}

输出与上面相同。

相关内容