使 pgfplots 中的绘图更平滑

使 pgfplots 中的绘图更平滑

我正在尝试使用 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}

其结果是:

Pgfplots 输出

与(在 OS X Grapher 应用程序中绘制)相比

OS X 绘图器输出

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相当于surfsmooth并且它保留了配色方案,这与我的原始答案不同。

shader=interp删除网格线,但由于上述事实,您可以添加其中一些网格线,因此:

CF 的答案加上网格线

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

在此处输入图片描述

相关内容