我正在尝试可视化通过围绕 x 轴旋转两个图形所生成的体积。例如,对于函数 f(x) = x^3 + 1 和 g(x) = x + 1(在区间 [0,1] 上)。以下是我迄今为止尝试过的方法:
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\u}{1.5}
\begin{axis}[
x={(3.2*\u cm,0.0cm)},
y={(0cm,\u cm)},
z={(-\u*0.3535cm,-\u*0.3535cm)},
axis lines=center,
xmin=0
]
\addplot3[opacity=0.3,surf,shader=flat,
samples=40,
domain=0:1,y domain=0:2*pi,
z buffer=sort]
(x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});
\addplot3[opacity=0.3,surf,shader=flat,
samples=40,
domain=0:1,y domain=0:2*pi,
z buffer=sort]
(x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});
\end{axis}
\end{tikzpicture}
我不是 pgfplots 专家,所以我不知道如何才能从视觉上改善这张图片(即体积结构变得更加清晰)。体积可能已填充,也可能未填充。
那么如何才能使这个例子看起来更清楚呢?
唯一的限制是轴方向应该保持与我的例子一样。
答案1
我不确定我是否正确理解了你的问题,所以这只是“希望”,这就是你正在寻找的东西。
首先说明一下:
希望您已经清楚,目前 PGFPlots 无法“组合”多个\addplot3
s 来获得真正的透视图。\addplot3
s 只是按出现的顺序绘制(参见手册(v1.14)第 123 页第 4.6.1 节“开始使用 3D 之前”)。
现在有一个可能的解决方案:
由于上述原因,您只能使两个图的“对比度”更大。一种方法是给它们赋予不同的颜色,例如...
\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\u}{1.5}
\begin{axis}[
x={(3.2*\u cm,0.0cm)},
y={(0cm,\u cm)},
z={(-\u*0.3535cm,-\u*0.3535cm)},
axis lines=center,
xmin=0,
%
% moved all common keys of the plots here
every axis plot/.append style={
opacity=0.3,
surf,
shader=flat,
samples=40,
domain=0:1,
y domain=0:2*pi,
z buffer=sort,
},
]
\addplot3 [
draw=blue!80,
fill=blue!50,
] (x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});
\addplot3 [
draw=red!80,
fill=red!50,
] (x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});
\end{axis}
\end{tikzpicture}
\end{document}
这导致
(如果你需要真实的透视结果,也许包tikz-3dplot
可以帮助?)
答案2
您可以将外部图分成不同的部分,一个在前景,一个在背景,然后使用图层来增强 3D 效果。
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\u}{1.5}
\begin{axis}[set layers,
x={(3.2*\u cm,0.0cm)},
y={(0cm,\u cm)},
z={(-\u*0.3535cm,-\u*0.3535cm)},
axis lines=center,
xmin=0
]
\addplot3[opacity=0.2,surf,shader=flat,on layer=axis background,
samples=20,
domain=0:1,y domain=pi:2*pi,
z buffer=sort]
(x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});
\addplot3[opacity=0.4,surf,shader=flat,on layer=main,
samples=40,
domain=0:1,y domain=0:2*pi,
z buffer=sort]
(x,{(x^3 + 1)*cos(deg(y))}, {(x^3 + 1) * sin(deg(y))});
\addplot3[opacity=0.2,surf,shader=flat,on layer=axis foreground,
samples=20,
domain=0:1,y domain=0:pi,
z buffer=sort]
(x,{(x + 1)*cos(deg(y))}, {(x+1) * sin(deg(y))});
\end{axis}
\end{tikzpicture}
\end{document}