TiKz 能否绘制具有图形正态分布的矩阵图?

TiKz 能否绘制具有图形正态分布的矩阵图?

您认为 TikZ 是实现此目的的最佳方法吗?

在此处输入图片描述

您还能想到其他什么方法吗?

答案1

如果您不想对小图片进行那么多的控制和精度,您可以使用以下解决方案。

它用

  • amstext(通常由amsmath对于\text宏,
  • blkarray对于列之间的括号(这里可以轻松使用各种 TikZ(mark) 解决方案),以及
  • PGF/TikZ

TikZ 图片由两条轴路径和一条绘图路径组成。

图片的常用坐标系缩小了 10 倍。我采用了一种相当不寻常的轴坐标方式,只使用了因子1(基本单位)的坐标。实际X值是通过xy因子计算的。

这样,轴就不会随图或整个 TikZ 图片缩放,但毕竟domain也会影响图。这里可以介绍一种特殊样式,它根据域设置所有其他设置。我使用了两个具有边界值的示例,以便轴必须延长,或者整个图片必须缩小,这可能不是一个真正的用例,因为这会扭曲与其他图片的任何关系。

请注意,samples值过高会大大减慢处理速度。建议将计算外部化(gnuplot)和/或使用externalTikZ 库。您也可以预先计算一些值(table然后您需要一个图)并简单地更改坐标系和/或缩放生成的图片。

代码

\documentclass{article}
\usepackage{amstext}
\usepackage{blkarray}
\usepackage{tikz}
\tikzset{
  declare function={NormDist(\xValue,\meanValue,\standardDeviation)=1/(\standardDeviation*sqrt(2*pi))*exp(-((\xValue-\meanValue)^2)/(2*\standardDeviation^2));},
}
\newcommand*{\tikzNormDist}[3][]{%
  \begin{tikzpicture}[every mini plot picture/.try,#1]
    \path[every mini plot x axis/.try] (-1,0) -- (1,0);
    \path[every mini plot y axis/.try] (0,0) -- (0,1) [mini plot y axis arrow/.try];
    \draw[every mini plot plot/.try]   plot[variable=\x] (\x,{NormDist(\x,#2,#3)});
  \end{tikzpicture}
}
\tikzset{
  every mini plot picture/.style={x=+1mm, y=+1mm, baseline=.5},
  every mini plot x axis/.style={draw,thin,x=+2mm},
  every mini plot y axis/.style={draw,thin,y=+2.2mm},
  every mini plot plot/.style={
    thick,
    red,
    smooth,
    samples=40,
    domain=-2:2,
  },
  mini plot y axis arrow/.style={
    insert path={
      [line cap=round, line join=round]+(+.25mm,+-.5mm) -- +(+0,+0) -- +(+-.25mm,+-.5mm)
    }
  }
}
\begin{document}
\[
  \begin{blockarray}{l c*2{@{\hphantom{{}+{}}}c}}
   & \text{Table} & \text{Bed} & \text{Pat} \\
  \begin{block}{l(*2{c@{{}+{}}}c)}
  \text{Table} & \tikzNormDist{0}{0.3}   & \tikzNormDist[
                                               every mini plot plot/.append style={blue!50!red,fill=blue!50!green},
                                               every mini plot y axis/.append style={y=+3.5mm}
                                           ]{-.3}{0.15}               & \tikzNormDist{-.2}{0.4} \\
  \text{Bed}   & \tikzNormDist{.2}{0.5}  & \tikzNormDist{.7} {0.7}    & \tikzNormDist{-.5}{0.7} \\
  \text{Pat}   & \tikzNormDist{-.1}{0.4} & \tikzNormDist{-.1}{1}      & \tikzNormDist[
                                                                            every mini plot plot/.append style={domain=-10:10,x=+.25mm,y=+5mm}
                                                                        ]{0}{2} \\
  \end{block}
  & {} = 1 & {} = 1 & {} = 1 \\
  \end{blockarray}
\]
\end{document}

输出

在此处输入图片描述

答案2

由于我对乳胶没有太多经验,但我知道tikz我会使用它。如果你碰巧熟悉,R你可以将两者结合起来(例如http://www.texample.net/tikz/examples/tikzdevice-demo/)。

关于正态分布,你可以用 tikz 做的另一个例子是:http://www.texample.net/tikz/examples/animated-distributions/

我不太理解你画的矩阵。当使用矩阵节点来组织多个子图时,你可能必须将子图包装在矩阵中,如下所示:({\tikz{....}}参见https://tex.stackexchange.com/a/119306/19326)。

您可以考虑使用图片来表示正态分布,并使用 tikz 叠加模式。半替代方法是pgf图(这也是基于 tikz,但为什么要学习新工具),另一个是 pstricks。

相关内容