使用 tikz 的隐变量模型

使用 tikz 的隐变量模型

我想用 tikz 编写下图(潜在变量模型)。然而,尽管我阅读了 tikz 手册,我重新创建该图的所有尝试都失败了,请参阅下面的代码。

我怎样才能使节点和箭头更靠左对齐?

在此处输入图片描述

% latent variable model
\begin{tikzpicture}[transform shape, node distance=2cm,
roundnode/.style={circle, draw=black, very thick, minimum size=7mm},
squarednode/.style={rectangle, draw=black, very thick, minimum size=5mm},
arrow/.style = {semithick,-Stealth}
]

%Nodes
\node[roundnode](latent)[align=center]{T};
\node[squarednode](X2)[left=1.2cm of latent, align=center]{X2};
\node[squarednode](X1)[above= 0.5cm of X2, align=center]{X1};
\node[squarednode](X3)[below= 0.5cm of X2, align=center]{X3};

%Letters
\node[text width=3cm, left=1cm of X1]{e1};
\node[text width=3cm, left=1cm of X2]{e2};
\node[text width=3cm, left=1cm of X3]{e3};

%Arrows
\draw[arrow] (T) -- ["\lambda1"] (X1);
\draw[arrow] (T) -- ["\lambda2"] (X2);
\draw[arrow] (T) -- ["\lambda3"] (X3);

\draw[arrow] (e1) -- (X1);
\draw[arrow] (e2) -- (X2);
\draw[arrow] (e3) -- (X3);

\end{tikzpicture}

答案1

您的代码存在几个问题。

首先,指定节点的语法是

\node [<settings>] (<name>) at (<coordinate>) {<node text>};

唯一强制性的是{<node text>},因此\node {foo};是完全有效的。

如果你想画一条线或箭头到/从节点,<name>你使用的坐标是 ,而不是<node text>。你有

\node[roundnode](latent)[align=center]{T};

因此,为了从包含文本的节点绘制一条线T,您必须使用。 //节点也是\draw (latent) ...如此。e1e2e3

我还想说,最好将所有设置放在同一个括号中,即

\node[roundnode,align=center] (latent) {T};

但实际上align=center,由于您尚未设置,因此这里什么也不做text width,所以我只会使用

\node[roundnode] (latent) {T};

下一点是\node[text width=3cm, left=1cm of X1]{e1};。我会删除text width这里的设置,您不希望节点比文本宽得多(e1),对吗?

线路也存在问题

\draw[arrow] (T) -- ["\lambda1"] (X1);

看起来你正在尝试使用quotes库定义的语法,但这只是标签的简写,标签属于节点。所以我认为你必须这样做

\draw[arrow] (T) -- node["$\lambda_1$"] {} (X1);

注意我还使用了数学模式,因为\lambda仅在数学模式下有效,并将数字添加为下标。

从您的图像来看,您可能$e_1$也想要$X_1$

对于k节点,我在下面的代码中添加了一个建议。我Xk在下面添加了节点X3,但请注意,我添加了节点yshift=0.5cm 的设置X2,以将其稍微向上移动。

下面的代码还展示了如何使用\foreach循环缩短代码的示例。

完整代码。

代码输出

\documentclass[border=5mm]{standalone}
\usepackage{tikz} 
\usetikzlibrary{positioning,arrows.meta,quotes}
\begin{document}
% latent variable model
\begin{tikzpicture}[
  transform shape, node distance=2cm,
  roundnode/.style={circle, draw=black, very thick, minimum size=7mm},
  squarednode/.style={rectangle, draw=black, very thick, minimum size=5mm},
  arrow/.style = {semithick,-Stealth},
  dotnode/.style={fill,inner sep=0pt,minimum size=2pt,circle} % <- this is new
]

%Nodes
\node[roundnode] (latent) {$T$};
\node[squarednode, left=1.2cm of latent,yshift=0.5cm] (X2) {$X_2$}; % note addition of yshift
\node[squarednode, above=0.5cm of X2]    (X1) {$X_1$};
\node[squarednode, below=0.5cm of X2]    (X3) {$X_3$};
\node[squarednode, below=0.5cm of X3]    (Xk) {$X_k$};

%Letters
%\node[left=1cm of X1] (e1) {$e_1$};
%\node[left=1cm of X2] (e2) {$e_2$};
%\node[left=1cm of X3] (e3) {$e_3$};
%\node[left=1cm of Xk] (ek) {$e_k$};
%
%%Arrows
%\draw[arrow] (latent) -- node["$\lambda_1$"inner sep=1pt]{} (X1.east);
%\draw[arrow] (latent) -- node["$\lambda_2$"{inner sep=1pt,yshift=-3pt}]{} (X2.east);
%\draw[arrow] (latent) -- node["$\lambda_3$"{inner sep=1pt,yshift=-2pt}]{} (X3.east);
%\draw[arrow] (latent) -- node["$\lambda_k$"inner sep=1pt]{} (Xk.east);
%
%\draw[arrow] (e1) -- (X1);
%\draw[arrow] (e2) -- (X2);
%\draw[arrow] (e3) -- (X3);
%\draw[arrow] (ek) -- (Xk);

% the following loop does the same as the commented lines above
\foreach \i/\Yshift in {1/0,2/-3pt,3/-2pt,k/0}
{
   \node[left=1cm of X\i] (e\i) {$e_\i$};
   \draw[arrow] (latent) -- node["$\lambda_\i$"{inner sep=1pt,yshift=\Yshift}]{} (X\i.east);
   \draw[arrow] (e\i) -- (X\i);
}

% drawing the 
\path (X3) --
  node[dotnode,pos=0.2]{}
  node[dotnode,pos=0.5]{}
  node[dotnode,pos=0.8]{}
  (Xk);

\end{tikzpicture}
\end{document}

相关内容