pgfplots:如何平滑 3D 曲面图?

pgfplots:如何平滑 3D 曲面图?

已经过去很长时间了 - 基于问题是我想知道pgfplots2019 年是否已经支持基于坐标的 3D 图的表面平滑?


最小工作示例(MWE):

\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\usepackage{filecontents}

\begin{filecontents}{testdata.csv}
    x;y;z
    0;0;4
    0;1;4
    0;2;4
    1;0;2
    1;1;2
    1;2;2
    2;0;3
    2;1;3
    2;2;3
    3;0;0
    3;1;0
    3;2;0
\end{filecontents}

\begin{document}
    \begin{tikzpicture}
        \begin{axis}[table/col sep = semicolon]
            \addplot3[mesh, mesh/cols=3,surf, shader=interp] table[x=x, y=y, z=z] {testdata.csv};
        \end{axis}
    \end{tikzpicture}
\end{document}

结果截图:

结果截图


所需状态的屏幕截图:

所需状态的屏幕截图


如您所见,理想状态呈现出一些美丽grid lines而平滑的曲线,而不是粗糙的山峰。这在pgfplots当今完全可能吗?

[surf]不幸的是,将和结合起来[smooth]不起作用plot

答案1

我认为,到目前为止,还没有smooth曲面图选项。但是,您可以自己平滑表格数据。与任何平滑一样,这带有处方和参数。如果您绘制一维曲线,则可以指定张力,因此您可能希望将以下代码中的\mysigmax\mysigmay参数视为具有类似的用途。

\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.16}
\usepackage{filecontents}

\begin{filecontents*}{testdata.csv}
    x;y;z
    0;0;4
    0;1;4
    0;2;4
    1;0;2
    1;1;2
    1;2;2
    2;0;3
    2;1;3
    2;2;3
    3;0;0
    3;1;0
    3;2;0
\end{filecontents*}

\begin{document}
\begin{tikzpicture}
  \pgfplotstableread[col sep=semicolon]{testdata.csv}\datatable
  \pgfplotstablegetrowsof{\datatable}
  \pgfmathtruncatemacro{\Xmax}{\pgfplotsretval-1}
  \pgfmathsetmacro\mysum{0}
  \pgfmathsetmacro\mysigmax{0.5}
  \pgfmathsetmacro\mysigmay{0.3}
  \pgfplotsforeachungrouped \X in {0,...,\Xmax}{
     \pgfplotstablegetelem{\X}{x}\of{\datatable}
     \edef\myx{\pgfplotsretval}
     \pgfplotstablegetelem{\X}{y}\of{\datatable}
     \edef\myy{\pgfplotsretval}
     \pgfplotstablegetelem{\X}{z}\of{\datatable}
     \edef\myz{\pgfplotsretval}
     \edef\mysum{\mysum+\myz*exp(-((x-\myx)^2/\mysigmax+(y-\myy)^2/\mysigmay))}
  }
  %\typeout{\mysum}
        \begin{axis}[table/col sep = semicolon]
            %\addplot3[mesh, mesh/cols=3,surf, shader=interp] table[x=x, y=y, z=z] {testdata.csv};
            \addplot3[surf,domain=0:3,domain y=0:2] {\mysum};
        \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

如果你设置\mysigmay3,你会得到

在此处输入图片描述

相关内容