使用 tikz 的高斯椭圆体

使用 tikz 的高斯椭圆体

我正在尝试使用阴影椭圆绘制高斯椭圆的插图。简而言之,我想要的是一种在椭圆的外边缘使用浅色阴影并在椭圆的中心使用较深的阴影的方法(即 2D 高斯分布的轮廓应具有与密度成比例的相同阴影)。我尝试过径向阴影,但这不是我想要的效果。

这是一个简单的例子(它没有产生我想要的着色结果)。

  \begin{tikzpicture}
    \def\particles{(20,-3),(22,-5),(22,-7),(19,-8) }
     \pgfsetfillopacity{0.6};

    \foreach \point in \particles{
      \shade[rotate around={30:\point},inner color=green] \point ellipse (1 and 2);         
      \draw[fill=black] \point circle (2mm);
    } 
  \end{tikzpicture}

在此处输入图片描述

有人可以建议一种绘制高斯椭圆体的方法吗?

答案1

你可以做的是将许多椭圆层叠起来,每个椭圆都比前一个略小且略暗。如果椭圆数量足够多,这会产生平滑渐变的效果。在下面的代码中,我使用了十个椭圆,但你可以根据自己的喜好进行调整。

代码

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \def\particles{(20,-3),(22,-5),(22,-7),(19,-8) }

    \foreach \point in \particles{
      \foreach\i in {0,0.1,...,1} {
        \fill[opacity=\i,green,rotate around={30:\point}] \point ellipse ({1-\i} and {2-2*\i});         
      }
      \fill[black] \point circle (2mm);
    } 
  \end{tikzpicture}
\end{document}

结果

在此处输入图片描述


在下面的代码中,我使用了 100 个椭圆。我还将不透明度调整了 倍0.02。这没什么方法,我只是摆弄数字,直到看起来“正确”。

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \def\particles{(20,-3),(22,-5),(22,-7),(19,-8) }
    \foreach \point in \particles{
      \foreach\i in {0,0.01,...,1} {
        \fill[opacity=\i*0.02,green,rotate around={30:\point}] \point ellipse ({1-\i} and {2-2*\i});         
      }
      \fill[black] \point circle (2mm);
    } 
  \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

您还可以使用 PGFPlots 并采用以下方法在 TikZ 中绘制二元正态分布绘制高斯椭圆。请注意,这比 John 的方法慢得多。

\documentclass{standalone}

\usepackage{pgfplots}
\usepgfplotslibrary{patchplots}

\begin{document}

\pgfplotsset{
colormap={whitered}{color(0cm)=(white); color(1cm)=(orange!75!red)}
}

\begin{tikzpicture}[
    rotate=30,
    declare function={mu1=1;},
    declare function={mu2=2;},
    declare function={sigma1=0.5;},
    declare function={sigma2=1;},
    declare function={normal(\m,\s)=1/(2*\s*sqrt(pi))*exp(-(x-\m)^2/(2*\s^2));},
    declare function={bivar(\ma,\sa,\mb,\sb)=
        1/(2*pi*\sa*\sb) * exp(-((x-\ma)^2/\sa^2 + (y-\mb)^2/\sb^2))/2;}]
\begin{axis}[
    colormap name=whitered,
    width=15cm,
    view={0}{90},
    enlargelimits=false,
    domain=0:2,
    y domain=0:4,
    samples=17,
    axis equal image,
    hide axis,
]
\addplot3 [surf, draw=none, shader=interp, patch type=bilinear] {bivar(mu1,sigma1,mu2,sigma2)};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容