在 pgfplots 中绘制带有淡入淡出的二维高斯分布

在 pgfplots 中绘制带有淡入淡出的二维高斯分布

我想在 2D 平面上绘制高斯模式的强度分布。这由 I = exp(-2*(x^2+y^2)/w00^2) 给出,其中 x 和 y 是与中心轴的距离,w00 是常数。我希望高斯中心(强度最高)以某种特定颜色绘制(理想情况下为浅橙色或红色),并且随着与中心距离的增加,该颜色应逐渐变为白色,这与高斯强度一致。下面是一个 MWE,它绘制了一个圆圈,并朝着圆圈的边缘从红色逐渐变为白色。然而,标准褪色似乎是线性的。

在我的例子中,褪色应该按照高斯函数进行,因此峰值周围的颜色变化较慢,然后急剧下降,然后在很远的距离处缓慢趋于白色。它不应该只是线性的。如何使用 pgfplots 包实现这一点?

\documentclass{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{pgfplots}

\pgfplotsset{compat=newest}

\begin{document}
    \begin{tikzpicture}
        \fill[inner color=red, outer color=white] (0,0) circle (1);
    \end{tikzpicture}
\end{document}

答案1

你可以作弊。当然,如果你添加轴等,这种方法就行不通了,因为这样会发现图只会变得更白,而不是消失。

\documentclass[tikz,border=3.14pt]{standalone}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{colormaps}
\begin{document}
    \begin{tikzpicture}
      \begin{axis}[axis lines = none,colormap={fake}{
rgb255(0cm)=(255,255,255); rgb255(1cm)=(255,0,0)}]
        \addplot3[domain=-3:3,point meta=z,mesh,
    z buffer=sort] {exp(-2*(x^2+y^2)/2^2)};
      \end{axis}
    \end{tikzpicture}
    \begin{tikzpicture}
      \begin{axis}[axis lines = none,colormap={fake}{
rgb255(0cm)=(255,255,255); rgb255(1cm)=(255,0,0)}]
        \addplot3[domain=-3:3,point meta=z,surf,shader=interp,
    z buffer=sort] {exp(-2*(x^2+y^2)/2^2)};
      \end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一次尝试元帖子这可能会启发某人向您展示如何在 pgfplots 中做某事。

在此处输入图片描述

\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
%\mplibtextextlabel{enable}
%\mplibnumbersystem{double}
\begin{mplibcode}
beginfig(1);

    vardef exp(expr x) = mexp(256x) enddef; % hide MP's version of exp

    vardef normal_pdf(expr x) = 
        exp(-1/2x*x)/2.50662827463  % \sqrt(2\pi) \simeq 2.50663 
    enddef;

    numeric r, s, u, v; 
    u = 16mm; v = 16mm; r=4; s=1/256;

    for t=-r step s until r: 
        y := normal_pdf(t);
        drawdot (t*u, y*5v) withpen pencircle scaled 1/2 
                            withcolor (2y)[white, blue]; 
    endfor

    % axes
    draw (left--right) scaled (r*u);
    draw (down--up) scaled 2;

endfig;
\end{mplibcode}
\end{document}

这已被包裹起来,luamplib因此您需要使用它lualatex来通过示例进行编译,或使其适应普通的 Metapost。

我的想法是使用坐标值y来改变颜色,并绘制足够多的点,使线​​条看起来连续。您也可以使用该y值来更改点的大小。

相关内容