使用 Tikz 和 Gnuplot 在定义区域内进行绘图

使用 Tikz 和 Gnuplot 在定义区域内进行绘图

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

在此处输入图片描述

相关内容