我是 Tikz 新手,我想用 tikz 库自动机绘制二项树。其他问题建议使用库定位,并使用语法 right=of (node) 而不是 right of=node。我得到了以下树(节点 5 和 6 重叠)。有没有一种简单的方法可以自动将节点 5 稍微向左移动一点,将节点 6 向右移动一点,而无需调整距离和其他参数?(因为解决方案应该可以扩展)。
\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{automata}
\usetikzlibrary{calc,arrows.meta,positioning}
\newcommand{\iddots}{\reflectbox{$\ddots$}}
\begin{document}
\resizebox{\textwidth}{!}{
\begin{tikzpicture}[-latex,shorten >=1pt,auto,node distance=40mm,semithick, state/.style={circle, draw, minimum size=2cm}]
\node[state, label={$\tilde{S}^1$}](1){1};
\node[state](2)[below left=of 1] {2};
\node[state](3)[below right=of 1] {3};
\node[state](4)[below left=of 2] {4};
\node[state](5)[below right=of 2] {5};
\node[state](6)[below left=of 3] {6};
\node[state](7)[below right=of 3] {7};
\path[->] (1) edge [swap] node {$1-p$}(2)
;
\end{tikzpicture}}
\end{document}
答案1
使用专门用于绘制树的包来绘制forest
树,树的代码会变得更简单、更短。
编辑:考虑到 OP 在评论中的请求,一些边缘应该有虚线图案。
\documentclass[border=3.141592]{standalone}
%\documentclass{article}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{forest}
for tree={
% nodes
circle, draw, semithick,
minimum size=1.3em, inner sep=0pt,
math content,
% tree
l sep =12mm,
s sep = 6mm,
/tikz/arr/.style = {draw=cyan!60, -{Triangle[angle=45:2pt 3]}, shorten >=1pt},
% for the case when you like to have
% all edges to bottom nodes dashed;
% using this, remove next code line with edge = arr,
%if level = 1{edge=arr}{edge={arr, dashed}},
edge = arr,
},
%% edge labels
/tikz/ELS/.style = {% Edge Label Style
pos=0.5, node
font=\footnotesize, text=blue, anchor=#1},
EL/.style={if n=1{edge label={node[ELS=east]{$#1$}}}
{edge label={node[ELS=west]{$#1$}}}}
%%%% diagram body
[1, label=$\tilde{S}^1$
[2, EL=1-p
[4,edge=dashed]
[5,edge=dashed]
]
[3, EL=p
[6]
[7]
]
]
\end{forest}
\end{document}
答案2
这里的问题是您的节点距离始终相同,因此存在重叠。我建议您使用创建树child nodes
并为每个级别设置sibbling distance
。这样您就可以控制节点的位置。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[%
auto,
semithick,
edge from parent/.style={draw=blue,-latex,shorten >=1pt},
dashedge/.style={draw=blue,-latex,shorten >=1pt,dashed},
state/.style={circle, draw=black, minimum size=1cm},
level distance=3cm,
level 1/.style={sibling distance=6cm},
level 2/.style={sibling distance=2.5cm}]
\node[state, label={$\tilde{S}^1$}](ROOT){1}
child {node[state](1-1) {2}
child {node[state](2-1){4} edge from parent[dashedge]} %<--- CHANGE HERE
child {node[state](2-2){5} edge from parent[dashedge]} %<--- CHANGE HERE
}
child {node[state](1-2) {3}
child {node[state](2-3){6}}
child {node[state](2-4){7}}
};
\end{tikzpicture}
\end{document}
既然您要求具有缩放的可能性,您可以看到只有两个参数需要更改,以便您可以根据缩放比例来解析它们。
编辑
我增加了绘制不同类型边的可能性。