已经过去很长时间了 - 基于这和这问题是我想知道pgfplots
2019 年是否已经支持基于坐标的 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}
如果你设置\mysigmay
为3
,你会得到