我正在尝试使用 pgfplots 绘制一个函数:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat = 1.12}
\newcommand{\param}{2.0}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={40}{50}]
\addplot3[surf, domain = 0:1, y domain = 0:1, unbounded coords=jump,
samples = 50]
{x^(-\param-1)*y^(-\param-1)*(x^(-\param)+y^(-\param)-1)^(-1/\param-2)+\param*x^(-\param-1)*y^(-\param-1)*(x^(-\param)+y^(-\param)-1)^(-1/\param-2)};
\end{axis}
\end{tikzpicture}
\end{document}
其结果是:
与(在 OS X Grapher 应用程序中绘制)相比
pgfplots 生成的图在 附近“粗糙”得多x=y=0
。我尝试将样本数量从默认值增加到 50,但这并没有真正改善图。
答案1
的默认曲面图pgfplots
对每个矩形面片段使用两个三角形。通常,对角线并不重要——但在这种情况下,它确实很重要,结果不合适。
请注意,shader=interp
似乎选择了另一条对角线(无意中,但确实如此)。一个简单的解决方案是添加shader=interp
,除非您确实需要网格线。
\documentclass{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{patchplots}
\pgfplotsset{compat = 1.12}
\newcommand{\param}{2.0}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={40}{50}]
\addplot3[surf, domain = 0:1, y domain = 0:1, unbounded coords=jump,
shader=interp,
samples = 25]
{x^(-\param-1)*y^(-\param-1)*(x^(-\param)+y^(-\param)-1)^(-1/\param-2)+\param*x^(-\param-1)*y^(-\param-1)*(x^(-\param)+y^(-\param)-1)^(-1/\param-2)};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
这个答案现在是 CF 上述(更好)答案的附录(如何添加网格线):shader=interp
相当于surf
,smooth
并且它保留了配色方案,这与我的原始答案不同。
shader=interp
删除网格线,但由于上述事实,您可以添加其中一些网格线,因此:
\documentclass{article}\usepackage{pgfplots}\usepgfplotslibrary{patchplots}
\newcommand{\pt}{2}
\begin{document}\begin{tikzpicture}
\begin{axis}[3d box,width=8cm,view={147}{56},
domain=0:0.4,y domain=0:0.4,samples=32,
xlabel=$x$,ylabel=$y$,zlabel={$z$},]
\addplot3[surf,domain=0:0.4,y domain=0:0.4,unbounded coords=jump,shader=interp]
{%
x^(-\pt-1)*y^(-\pt-1)*(x^(-\pt)+y^(-\pt)-1)^(-1/\pt-2)+\pt*x^(-\pt-1)*y^(-\pt-1)*(x^(-\pt)+y^(-\pt)-1)^(-1/\pt-2)%
};
\addplot3[domain=0:0.4,y domain=0:0.4,unbounded coords=jump,smooth]
{%
x^(-\pt-1)*y^(-\pt-1)*(x^(-\pt)+y^(-\pt)-1)^(-1/\pt-2)+\pt*x^(-\pt-1)*y^(-\pt-1)*(x^(-\pt)+y^(-\pt)-1)^(-1/\pt-2)%
};
\end{axis}\end{tikzpicture}\end{document}
网格线本身是:
pgfplots 中实现了通过三次贝塞尔曲线进行平滑。(参见pgfplots 手册。
\addplot3[...,smooth,...]
仅针对线或\addplot+[...,smooth,...]
给出上述内容并用蓝点填充。
考虑
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={40}{50}]
\addplot3 [y domain = 0:2,smooth]{-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi))+0.5*y*y*4};
\end{axis}
\end{tikzpicture}
\end{document}
并与未平滑版本进行比较
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={40}{50}]
\addplot3 [y domain = 0:2]{-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi))+0.5*y*y*4};
\end{axis}
\end{tikzpicture}
\end{document}
没错,颜色有问题。问题中的方程式是 1/x^5*1/y^3+ 2/x^5*1/y^3+2*y^(9/2) 减小。它非常清晰,而使用 256 个样本会导致主内存耗尽,TeX 会停止编译... 使用大约 100 个样本进行平滑处理并旋转视图可能是唯一的选择,当与兼容的颜色方案一起使用以返回表面填充时。
答案3
只是为了展示另一种绘图方法,这里是 LaTeX-R-knitr 解决方案。
\documentclass[10pt,letterpaper]{article}
\begin{document}
\begin{figure}[scale=2.5]
<<>>=
library(lattice)
param<-2
x<-seq(0,1,len=30)
y<-seq(0,1,len=30)
g<-expand.grid(x=x,y=y)
g$z<-(g$x^(-param-1)*g$y^(-param-1)*(g$x^(-param)
+g$y^(-param)-1)^(-1/param-2)+param*g$x^(-param-1)*g$y^(-param-1)*(g$x^(-param)
+g$y^(-param)-1)^(-1/param-2))
wireframe(z~x*y,g,drape=TRUE,aspect=c(1,1),colorkey=TRUE
,screen = list(x=-40,y=-60,z=-45))
@
%
\end{figure}
\end{document}