我希望这是一个非常简单的问题。我使用 tikz 制作一个用于验证性因子分析 (CFA) 的图形。在最小示例中,有 6 个箭头从圆圈指向一个固定位置。但是,正如之前的问题所指出的(TikZ:如何将节点设置在线的精确位置上?) 定位取决于线的长度,因此节点不会垂直对齐(尽管这只是边缘......)。因此,我想知道是否有可能(可能),让所有节点仍然对齐到线上,但 y 坐标(高度)完全相同。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (A) at (0,0) {A};
\draw[->] (A) -- (-2.5,-2) node[near end,fill=white] {u};
\draw[->] (A) -- (-1.5,-2) node[near end,fill=white] {v};
\draw[->] (A) -- ( -.5,-2) node[near end,fill=white] {w};
\draw[->] (A) -- ( .5,-2) node[near end,fill=white] {x};
\draw[->] (A) -- ( 1.5,-2) node[near end,fill=white] {y};
\draw[->] (A) -- ( 2.5,-2) node[near end,fill=white] {z};
\end{tikzpicture}
\end{document}
答案1
这与pgf 手册。您应该指定文本的高度和深度,最好通过ex
单位:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[text height=1.5ex,text depth=0.25ex]
\node[circle,draw] (A) at (0,0) {A};
\draw[->] (A) -- (-2.5,-2) edge[draw=none] node[near start,fill=white] (U) {u} (A.center);
\draw[->] (A) -- (-1.5,-2) edge[draw=none] node[near start,fill=white] {v} (A.center);
\draw[->] (A) -- ( -.5,-2) edge[draw=none] node[near start,fill=white] {w} (A.center);
\draw[->] (A) -- ( .5,-2) edge[draw=none] node[near start,fill=white] {x} (A.center);
\draw[->] (A) -- ( 1.5,-2) edge[draw=none] node[near start,fill=white] {y} (A.center);
\draw[->] (A) -- ( 2.5,-2) edge[draw=none] node[near
start,fill=white] (Z) {z} (A.center);
\draw (U.base) -- (Z.base);
\end{tikzpicture}
\end{document}
答案2
- 选项
anchor=base
将节点的参考点从中间移动到基线,效果是节点沿基线对齐。 - 其次,由于节点为圆形,线条并非从同一高度开始
A
。因此,相对定位near end
应参考A.center
,以使每个箭头获得相同的垂直分量。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (A) at (0,0) {A};
\foreach \x/\t in {-2.5/u, -1.5/v, -.5/w, .5/x, 1.5/y, 2.5/z} {
\draw[->] (A) -- (\x,-2);
\path (A.center) -- (\x,-2) node[
near end,
anchor=base,
fill=white,
]{\t};
}
\end{tikzpicture}
\end{document}
没有白色背景 hack
下面的示例通过首先绘制节点并制作一个穿过节点的独立箭头来摆脱白色背景。
还会
\foreach
自动计算水平位置。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (A) at (0,0) {A};
\foreach \t [
count=\i,
evaluate=\i as \x using {-2.5+\i-1}
] in {u, ..., z} {
\coordinate (\t0) at (\x,-2);
\path (A.center) -- (\x,-2) node [
near end,
anchor=base,
] (uz\i) {\t};
\draw[->] (A) -- (uz\i) -- (\x,-2);
}
\end{tikzpicture}
\end{document}
答案3
对我来说,最简单的解决方案是使用intersections
TikZ 中的库:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (A) at (0,0) {A};
\draw[name path=u,->] (A) -- (-2.5,-2);
\draw[name path=v,->] (A) -- (-1.5,-2);
\draw[name path=w,->] (A) -- ( -.5,-2);
\draw[name path=x,->] (A) -- ( .5,-2);
\draw[name path=y,->] (A) -- ( 1.5,-2);
\draw[name path=z,->] (A) -- ( 2.5,-2);
\path[name path=level] (-2.5,-1.5)--(2.5,-1.5);
\foreach \x in {u,...,z}{
\path[name intersections={of=level and \x}](intersection-1) node[fill=white]{\x};
}
\end{tikzpicture}
\end{document}
答案4
让所有节点达到同一高度的唯一方法(我知道)是将标签节点设置为这个特定的y-value
。这样,标签节点的 y 位置是固定的,并且使用部分坐标规范绘制线条。以下代码是如何执行此操作的一个简短示例:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node [circle, draw] (A) at (0,0) {A};
% set y-value
\newcommand{\y}{-2}
% loop over node-names and x-values
\foreach \n\x in {u/-2.5,v/-1.5,w/-.5,x/.5,y/1.5,z/2.5} {
% draw the arrowed line with offset over end point
\draw [->] (A) -- ($ (A)!1.25!(\x, \y) $);
% draw the node and fill background white
\node (\n) [fill=white] at (\x, \y) {\n};
}
\end{tikzpicture}
\end{document}
我们在这里所做的是为每个点绘制箭头线,(x,y)
坐标规格为 x1.25 线长。绘制箭头线后,标记节点将用白色填充背景绘制,以覆盖该线。
希望这可以帮助。