我想添加一行第一次抛掷、第二次抛掷、第三次抛掷和结果,就像这张图片一样
我试过
\documentclass{standalone}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\tikzset{grow'=right}
\tikzset{execute at begin node=\strut}
\tikzset{every tree node/.style={anchor=base west}}
\Tree [ [.H [.H [.H ][.T ]][.T [.H ][.T ]] ] [.T [. H [.H ][.T ] ][.T [.H ] [.T ]] ]]
\end{tikzpicture}
\end{document}
我得到了
答案1
这是一个forest
自动添加标签以及节点内容和结果列表的解决方案。
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
/tikz/every node/.append style={font=\sffamily},
toss/.style={
before drawing tree={
tikz/.wrap pgfmath arg={\node at ([yshift=10pt].center |- h.north) {Toss ##1};}{level()},
}
},
tosses/.style={
name=h,
for ancestors'={if level=0{}{toss}},
before packing={
!1.tikz={\node at ([yshift=10pt].center |- h.north) {Outcomes};}
}
},
for tree={
grow'=0,
parent anchor=east,
child anchor=west,
anchor=west,
tier/.wrap pgfmath arg={tier #1}{level()},
l sep+=20pt,
font=\sffamily,
delay={
if level=0{}{
if n=1{content=H}{content=T}
}
}
},
before typesetting nodes={
where n children=0{
append={[, edge={dashed}, anchor=west, font=\sffamily, content/.wrap 3 pgfmath args={(#1,#2,#3)}{content("!uuu")}{content("!uu")}{content("!u")}]}
}{}
}
[
[
[
[, tosses]
[]
]
[
[]
[]
]
]
[
[
[]
[]
]
[
[]
[]
]
]
]
\end{forest}
\end{document}
简介forest
在我的回答的第二部分可以找到这里。
此处配置的复杂性仅归因于自动化,它依赖于在绘制过程的特定阶段执行特定操作。实际的树规范很简单。
[实际上它只是一堆方括号,一个逗号和字符串tosses
。还有什么比这更简单的?!]
编辑
您可以调整树序言中的节点和标签的内容。我添加了三条注释来突出显示应执行此操作的点,并用圆圈和实心圆圈代替pifont
H 和 T 来说明这个想法。由于这可能使“掷球”不合适,我还将标签前缀更改为“球”。
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest,pifont}
\begin{document}
\begin{forest}
/tikz/every node/.append style={font=\sffamily},
toss/.style={
before drawing tree={% specify the prefix of the labels at the top here
tikz/.wrap pgfmath arg={\node at ([yshift=10pt].center |- h.north) {Ball ##1};}{level()},
}
},
tosses/.style={
name=h,
for ancestors'={if level=0{}{toss}},
before packing={% specify the label for the final (rightmost) level here
!1.tikz={\node at ([yshift=10pt].center |- h.north) {Outcomes};}
}
},
for tree={
grow'=0,
parent anchor=east,
child anchor=west,
anchor=west,
tier/.wrap pgfmath arg={tier #1}{level()},
l sep+=20pt,
font=\sffamily,
delay={
if level=0{}{% specify the contents of the nodes here
if n=1{content=\ding{109}}{content=\ding{108}},
}
}
},
before typesetting nodes={
where n children=0{
append={[, edge={dashed}, anchor=west, font=\sffamily, content/.wrap 3 pgfmath args={(#1,#2,#3)}{content("!uuu")}{content("!uu")}{content("!u")}]}
}{}
}
[
[
[
[, tosses]
[]
]
[
[]
[]
]
]
[
[
[]
[]
]
[
[]
[]
]
]
]
\end{forest}
\end{document}
答案2
考虑到您所做的工作,最简单的方法是使用 TikZ 的机制绘制两棵树,一棵在另一棵之上scope
。我增加了除最后一个分支之外的树枝的水平距离以容纳标签,并手动将标签树向左移动以更好地对齐标签。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\tikzset{grow'=right}
\tikzset{execute at begin node=\strut}
\tikzset{every tree node/.style={anchor=base west}, level distance=1in,level 4+/.style={level distance=.5in,edge from parent/.append style={dashed}}}
\Tree [
[.H
[.H
[.H [.{(H,H,H)} ]]
[.T [.{(H,H,T)} ]]]
[.T
[.H [.{(H,T,H)} ]]
[.T [.{(H,T,T)} ]]]]
[.T
[.H
[.H [.{(T,H,H)} ]]
[.T [.{(T,H,T)} ]]]
[.T
[.H [.{(T,T,H)} ]]
[.T [.{(T,T,T)} ]]]]
]
\begin{scope}[xshift=-1cm,yshift=4.5cm, edge from parent/.style={draw=none},align=center,level 4+/.style={level distance=.8in}]
\Tree [.{} [.{First Toss} [.{Second Toss} [.{Third Toss} [.{Outcomes} ] ] ] ] ]
\end{scope}
\end{tikzpicture}
\end{document}
对于类似的问题,请参见:如何将标题与用 tikz-qtree 绘制的树的每一级对齐?