![如何绘制这顶特殊的墨西哥帽的潜力?](https://linux22.com/image/305954/%E5%A6%82%E4%BD%95%E7%BB%98%E5%88%B6%E8%BF%99%E9%A1%B6%E7%89%B9%E6%AE%8A%E7%9A%84%E5%A2%A8%E8%A5%BF%E5%93%A5%E5%B8%BD%E7%9A%84%E6%BD%9C%E5%8A%9B%EF%BC%9F.png)
我知道这里还有其他一些关于墨西哥帽的问题,但我觉得这些答案都不完整。我想用 TikZ 绘制下图,并采用类似的轴和标签。该怎么做呢?
我的最小例子如下
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines=center, axis on top = false,
view={140}{15},axis equal,title={The Mexican hat potential},
colormap={blackwhite}{gray(0cm)=(1); gray(1cm)=(0)},
samples=30,
domain=0:360,
y domain=0:1.25,
zmin=0,
zmax=0.9,
xlabel=$\phi_{Im}$,
ylabel=$\phi_{Re}$,
zlabel=$V$,
yticklabels={,,},
xticklabels={,,},
zticklabels={,,}
]
\addplot3 [surf, shader=flat, draw=black, fill=white, z buffer=sort] ({sin(x)*y}, {cos(x)*y}, {(y^2-1)^2});
\end{axis}
\end{tikzpicture}
\end{document}
我不喜欢其输出(见下文),因为我想要一个右手坐标系,z 轴指向上方,x 轴指向屏幕外,如附图所示。如果破折号太难实现,我也可以不用它们。
为了使轴正确,我调整了视角以“使其正确”,但目前这也不是那么简单。最后,从输出中可以看出,标签肯定是错误的。任何帮助都将不胜感激。
编辑:标签似乎存在某种错误。我会尝试在此主题中推荐。
答案1
我们画出来可以吗?
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots,amsmath}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
hide axis,
%axis lines=middle,
% axis on top,
% axis line style={blue,dashed,thick},
% ymin=-2,ymax=2,
% xmin=-2,xmax=2,
% zmin=-2,zmax=2,
samples=30,
domain=0:360,
y domain=0:1.25,clip=false
]
\addplot3 [surf, shader=flat, draw=black, fill=white, z buffer=sort]
({sin(x)*y}, {cos(x)*y}, {(y^2-1)^2});
\draw[blue,thick,dashed] (axis cs:0,0,0) -- (axis cs:1,0,0)
node[below,font=\footnotesize]{$\phi_{\text{IM}}$};
\draw[blue,thick,-stealth] (axis cs:1,0,0) -- (axis cs:1.3,0,0)
node[above,font=\footnotesize]{$\hat{y}$};
\draw[blue,thick,dashed] (axis cs:0,0,0) -- (axis cs:0,-1,0)
node[left=2mm,font=\footnotesize]{$\phi_{\text{RE}}$};
\draw[blue,thick,-stealth] (axis cs:0,-1,0) -- (axis cs:0,-1.5,0)
node[right=1mm,font=\footnotesize]{$\hat{x}$};
\draw[blue,thick,dashed] (axis cs:0,0,0) -- (axis cs:0,0,1)
%node[left=2mm,font=\footnotesize]{$\phi_{\text{RE}}$}
;
\draw[blue,thick,-stealth] (axis cs:0,0,1) -- (axis cs:0,0,1.3)
node[right,font=\footnotesize]{$\hat{z}$};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
注意:我注意到下面的墨西哥帽潜力 PDF 有点损坏。我怀疑是阴影球损坏了。当您尝试打印它时,它是损坏的:在某些软件上无法打印(如 UNIX 的 acroread),而在其他一些软件上,只有四分之一(第三象限)的球实际上与文档的其余部分一起打印。
仅供未来的用户和参考,我想发布我对这个问题的解决方案。虽然它没有复制 OP 的图,但它甚至更好。所以这是我的代码,它非常手动,因为我必须通过反复试验和从许多不同的来源复制粘贴来获得它:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\pgfdeclarefunctionalshading{sphere}{\pgfpoint{-25bp}{-25bp}}{\pgfpoint{25bp}{25bp}}{}{
%% calculate unit coordinates
25 div exch
25 div exch
%% copy stack
2 copy
%% compute -z^2 of the current position
dup mul exch
dup mul add
1.0 sub
%% and the -z^2 of the light source
0.3 dup mul
-0.5 dup mul add
1.0 sub
%% now their sqrt product
mul abs sqrt
%% and the sum product of the rest
exch 0.3 mul add
exch -0.5 mul add
%% max(dotprod,0)
dup abs add 2.0 div
%% matte-ify
0.6 mul 0.4 add
%% currently there is just one number in the stack.
%% we need three corresponding to the RGB values
dup
0.4
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ axis lines=center, axis on top = false,
view={140}{25},axis equal,title={The Mexican hat potential},
colormap={blackwhite}{gray(0cm)=(1); gray(1cm)=(0)},
samples=50,
domain=0:360,
y domain=0:1.25,
zmin=0,
xmax=1.5,
ymax=1.5,
zmax=1.5,
x label style={at={(axis description cs:0.10,0.25)},anchor=north},
y label style={at={(axis description cs:0.9,0.2)},anchor=north},
z label style={at={(axis description cs:0.5,0.9)},anchor=north},
xlabel = $\mathrm{Re}(\phi)$,
ylabel=$\mathrm{Im}(\phi)$,
zlabel=$V(\phi)$,
yticklabels={,,},
xticklabels={,,},
zticklabels={,,}
]
\addplot3 [surf, shader=flat, draw=black, fill=white, z buffer=sort] ({sin(x)*y}, {cos(x)*y}, {(y^2-1)^2});
\end{axis}
\shade[shading=sphere] (3.47,3.5) circle [radius=0.15cm];
\shade[shading=sphere] (5.2,2.2) circle [radius=0.15cm];
\node[anchor=east] at (4.05,3.71) (text) {A};
\node[anchor=west] at (5.5,3.0) (description) {B};
\draw (description) edge[out=180,in=0,<-] (text);
\end{tikzpicture}
\end{document}
输出结果如下: