我正在尝试使用 Latex 中的 gnuplot 从 .txt 文件中绘制一些 x、y 和 z 值。绘图本身工作正常。问题是,应该有一个定义的轮廓围绕我的绘图。轮廓之外的所有内容都不应该可见。所以我尝试填充轮廓和正方形之间的区域,但这不起作用,我认为我的轮廓中有太多数据。另一种方法可能是此处描述的方法:Gnuplot 3D 热图但我不知道如何将它放入 Latex 中。
这是我的代码:
\RequirePackage{tikz}
\RequirePackage{pgfplots}
\documentclass{scrbook}
\usepackage{xcolor}
\usepackage{filecontents}
\RequirePackage{tikz}
\RequirePackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usepackage{tikzscale}
\begin{document}
\begin{tikzpicture}
\begin{filecontents*}{Points.dat}
#1 2 3
-0.346 0.28 207
-0.306 0.28 203
-0.266 0.28 210
-0.226 0.28 214
-0.226 0.20 244
-0.186 0.20 255
-0.266 0.12 248
-0.226 0.08 261
-0.186 0.08 246
0 0 320
0 0.3 260
-0.4 0.3 220
-0.4 0 240
\end{filecontents*}
\begin{filecontents*}{Outline.dat}
#1 2 3
-0.38 0.01 500
-0.38 0.296 500
-0.32 0.298 500
-0.217 0.299 500
-0.017 0.149 500
-0.009 0.157 500
-0.006 0.127 500
-0.002 0.093 500
-0.001 0.069 500
-0.002 0.056 500
-0.38 0.01 500
\end{filecontents*}
\begin{filecontents*}{Rand.dat}
#1 2 3
0.025 -0.025 500
0.025 0.325 500
-0.425 0.325 500
-0.425 -0.025 500
0.025 -0.025 500
\end{filecontents*}
\pgfdeclarelayer{pre main}
\pgfsetlayers{pre main,main}
\begin{axis}[colorbar,
xmin=-0.45,
xmax=0.05,
ymin=-0.05,
ymax=0.35,
view={0}{90},
]
\begin{pgfonlayer}{pre main}
\addplot3 [surf] gnuplot [raw gnuplot] {
set dgrid3d 40,40 spline;
splot 'Points.dat';
};
\end{pgfonlayer}
\begin{pgfonlayer}{main}
\addplot3 [no markers, very thick, name path=A] table []{Outline.dat};
\addplot3 [black,no markers, very thick, name path=B] table []{Rand.dat};
%\addplot3 [white] fill between[of=A and B];
\end{pgfonlayer}
\end{axis}
\end{tikzpicture}
\end{document}
多谢!
答案1
我宁愿剪掉不需要的区域,也不愿把它们涂成白色。而且,正如我在评论中所说,你需要使用\addplot
而不是,\addplot3
因为你只需要一个 2D 路径作为边界。如果你剪掉,你不需要fillbetween
,在我看来,这是极度低估的use path
诡计就足够了。
\RequirePackage{tikz}
\RequirePackage{pgfplots}
\documentclass{scrbook}
\usepackage{xcolor}
\usepackage{filecontents}
\RequirePackage{tikz}
\RequirePackage{pgfplots}
%\usepgfplotslibrary{fillbetween}
\usepackage{tikzscale}
\makeatletter % https://tex.stackexchange.com/a/38995/121799
\tikzset{
use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{filecontents*}{Points.dat}
#1 2 3
-0.346 0.28 207
-0.306 0.28 203
-0.266 0.28 210
-0.226 0.28 214
-0.226 0.20 244
-0.186 0.20 255
-0.266 0.12 248
-0.226 0.08 261
-0.186 0.08 246
0 0 320
0 0.3 260
-0.4 0.3 220
-0.4 0 240
\end{filecontents*}
\begin{filecontents*}{Outline.dat}
#1 2 3
-0.38 0.01 500
-0.38 0.296 500
-0.32 0.298 500
-0.217 0.299 500
-0.017 0.149 500
-0.009 0.157 500
-0.006 0.127 500
-0.002 0.093 500
-0.001 0.069 500
-0.002 0.056 500
-0.38 0.01 500
\end{filecontents*}
\begin{filecontents*}{Rand.dat}
#1 2 3
0.025 -0.025 500
0.025 0.325 500
-0.425 0.325 500
-0.425 -0.025 500
0.025 -0.025 500
\end{filecontents*}
\pgfdeclarelayer{pre main}
\pgfsetlayers{pre main,main}
\begin{axis}[colorbar,
xmin=-0.45,
xmax=0.05,
ymin=-0.05,
ymax=0.35,
view={0}{90},
]
\begin{pgfonlayer}{main}
\addplot [no markers, very thick,save path=\pathA] table []{Outline.dat}
\closedcycle;
\end{pgfonlayer}
\begin{pgfonlayer}{pre main}
\clip [use path=\pathA];
\addplot3 [surf] gnuplot [raw gnuplot] {
set dgrid3d 40,40 spline;
splot 'Points.dat';
};
\end{pgfonlayer}
\end{axis}
\end{tikzpicture}
\end{document}