层次统计图

层次统计图

我想用 LaTeX(可能使用 TikZ)创建如下图所示的图表。此图表和其他图表可在以下网址找到:本网站

它看起来像是用 LaTeX 制作的,但我不太确定。我该如何解决这个问题?TikZ 是否提供了用于创建此类图表的简单符号或模板?

在此处输入图片描述

答案1

其中一些图表不需要 TikZ 的功能;例如,使用标准,array您可以生成

\documentclass{article}
\usepackage{graphicx}
\usepackage{amsmath}

\newcommand\Marrowdown{\rotatebox[origin=c]{-90}{$\longrightarrow$}}

\begin{document}

\[
\setlength\arraycolsep{12pt}
\begin{array}{lccc}
  \text{parameters} & \theta_{1} & \theta_{2} & \theta_{3} \\
  & \Marrowdown & \Marrowdown & \Marrowdown \\ 
  \text{observations} & y_{1} & y_{2} &  y_{3} 
\end{array}
\]

\end{document}

在此处输入图片描述

TikZ 提供了许多可能的替代方案;例如,matrix of math nodes可以使用来生成所有这些图表。一个简单的例子:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}
\matrix[matrix of math nodes,column sep=15pt,row sep=15pt] (mat)
{
  \theta_{1} & \theta_{2} & \theta_{3} \\
  y_{1} & y_{2} &  y_{3} \\ 
};
\foreach \Columna in {1,2,3}
  \draw[->,>=latex] (mat-1-\Columna) -- (mat-2-\Columna);
\node[anchor=east] at ([xshift=-20pt]mat-1-1) {parameters};
\node[anchor=east] at ([xshift=-20pt]mat-2-1) {observations};

\end{tikzpicture}

\end{document}

在此处输入图片描述

使用链条的另一种可能性:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,chains}

\begin{document}

\begin{tikzpicture}
\begin{scope}[
  every node/.style={on chain,join},
  every join/.style={draw,->}
]
\begin{scope}[start chain=1 going below]
  \node {$\theta_{1}$};
  \node {$y_{1}$};
\end{scope}
\begin{scope}[xshift=1cm,start chain=2 going below]
  \node {$\theta_{2}$};
  \node {$y_{2}$};
\end{scope}
\begin{scope}[xshift=2cm,start chain=3 going below]
  \node {$\theta_{3}$};
  \node {$y_{3}$};
\end{scope}
\end{scope}
\node[anchor=east] at ([xshift=-20pt]1-1) {parameters};
\node[anchor=east] at ([xshift=-20pt]1-2) {observations};
\end{tikzpicture}

\end{document}

在此处输入图片描述

对于树木,特别是如果它们很复杂,我建议你使用强大的forest包(它基于 PGF/TikZ 构建并且专门用于构建树):

\documentclass{article}
\usepackage{forest}

\begin{document}

\begin{forest}
for tree={
  edge={->,>=latex},
  parent anchor=south,
  child anchor=north,
  content format={\ensuremath{\forestoption{content}}},
  }
[{\mu,\sigma^{2}},name=level0
  [\theta_{1},name=level1
    [y_{1},name=level2]
  ]
  [\theta_{2}
    [y_{2}]
  ]
  [\cdots,edge={draw=none}
    [\cdots,edge={draw=none}]
  ]
  [\theta_{k}
    [y_{k}]
  ]
]
\foreach \Name/\Label in {level2/parameters,level1/observations,level0/model}
  \node[anchor=east] at ([xshift=-30pt]\Name) {\Label};   
\end{forest}

\end{document}

在此处输入图片描述

如您所见,有多种选择,选择哪种取决于您要绘制的图表的复杂程度。重要的是保持一致;我的意思是,对于单个文档,理想的做法是选择一种工具并坚持使用它(以保证箭头尖端类型相同、节点之间的距离相同等)。

答案2

这只是另一种做事方式。需要最新的 PGF 版本:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta}
\usegdlibrary{layered}
\begin{document}
\tikz[>={Stealth[]}]
\graph [layered layout, fresh nodes, nodes={anchor=base, text height=0.5em}] {

  { [edge={draw=none}, nodes={text=black!75, font=\sf, anchor=base east}] 
    model -- parameters -- observations 
  };

  {[math nodes]
     "\mu,\sigma^2" -> { 
      "\theta_1" -> "y_1", 
      "\theta_2" -> "y_2",
      "\ldots" -> "\ldots", 
      "\theta_k" -> "y_k"};
  };
};
\end{document}

在此处输入图片描述

答案3

解决方案是使用pst-tree;它包括为文本绘制一棵平行树:

\documentclass[12pt, a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{MinionPro}
\usepackage[pdf, x11names]{pstricks}%
\usepackage{pst-node, pst-tree}
\def\noedge{\ncline[linestyle = none]}
\renewcommand\psedge{\ncline[arrows =-> ]}
\usepackage{eqparbox} 
\begin{document}
\psset{nodesep=3pt, levelsep =1.2cm}

\sffamily
\pstree[thislevelsep = 1.5cm, edge = \noedge]{\TR{\eqmakebox[L][r]{model}}}{%
\pstree{\TR[edge = \noedge]{\eqmakebox[L][r]{parameters}}}{\TR{\eqmakebox[L][r]{observations}}}
}%
\qquad
$ \pstree[thislevelsep = 1.5cm]{\TR{μ,σ^ 2}}{%
\pstree{\TR{θ_1}}{\TR{y_1}}
\pstree{\TR{θ_2}}{\TR{y_2}}
\pstree{\TR[edge = \noedge]{  ... }}{\TR[edge = \noedge]{  ... }}
\pstree{\TR *{θ_n}}{\TR{y_n}}
} $

\end{document} 

在此处输入图片描述

相关内容