我正在学习绘制森林图。
我正在绘制一棵有 n 个子节点的隐式树。
有三个问题我无法解决:
1)如何将虚线边缘改为(...)而不是(........)?(我怀疑“edge=dotted”必须改变。)2)如何标记一组边缘?
3)我的代码在森林环境中出现未知错误,可以自动更正。
最终代码:
\documentclass{article}
\usepackage{tikz}
\usepackage[linguistics]{forest}
\usetikzlibrary {decorations.pathreplacing}
\begin{document}
\begin{figure}
\begin{forest}
for tree={
coordinate, calign=fixed edge angles, calign angle=25, edge=thick,
{}
}
[, name=n1
[,l*=2]
[
[,l*=2]
[,name=d1
[,no edge]
[,no edge,name=d2
[,l*=2]
[,name=n2
[,l*=2
[]
[,l*=2]
]
[]
]
]
]
]
]
\draw[black, thick, decorate, decoration={brace, amplitude=4pt, raise=4pt}] (n1)--node[above right=5pt]{$n$ carets} (n2);
\path(d1)--node[sloped]{\Large\dots}(d2);
\end{forest}
\begin{forest}
for tree={
coordinate, calign=fixed edge angles, calign angle=25, edge=thick,
{}
}
[, name=n1
[,l*=2]
[
[,l*=2]
[,name=d1
[,no edge]
[,no edge,name=d2
[,l*=2]
[,name=n2
[,l*=2 ]
[
[,l*=2]
[]
]
]
]
]
]
]
\draw[black, thick, decorate, decoration={brace, amplitude=4pt, raise=4pt}] (n1)--node[above right=5pt]{$n$ carets} (n2);
\path(d1)--node[sloped]{\Large\dots}(d2);
\end{forest}
\caption{.}
\label{fig:generator}
\end{figure}
\end{document}
答案1
一些建议:
- 使用
coordinate
形状作为节点。 - 除了使用以外
tier
,您还可以使用 将每个左分支的长度加倍l*=2
。 - 你可以
name
使用节点然后使用基本 Ti钾Z 命令类似\draw
或\path
。 - 装饰
brace
是标记边组的一种方法。 \dots
这三个点可在一个节点中构成sloped
。
\documentclass{article}
\usepackage{forest}
\usetikzlibrary {decorations.pathreplacing}
\begin{document}
\begin{forest}
for tree={
coordinate, calign=fixed edge angles, calign angle=25, edge=thick,
if n=1{l*=2}{}
}
[, name=n1
[]
[
[]
[
[]
[, name=d1
[, no edge]
[, no edge, l*=1.5, name=d2
[]
[, name=n2
[
[]
[]
]
[]
]
]
]
]
]
]
\draw[red, thick, decorate, decoration={brace, amplitude=4pt, raise=4pt}] (n1)--node[above right=5pt]{$n$ carets} (n2);
\path(d1)--node[sloped]{\Large\dots}(d2);
\end{forest}
\end{document}
答案2
triple dots
将边缘变成一条不可见线上的三个点。我还删除了您未显示的节点处的点,但由于您没有提到这一点,我留下了注释来解释如何恢复它们。
triple dots
还处理边缘标记,因为就这一点而言,这两个集合具有完全相同的结构。
最后,我把您删除的导致错误的部分放回原处,并删除了您添加的导致其他错误的部分。切勿在 中留下未注释的空行forest
。与 不同tikzpicture
,forest
不会忽略 中的这些[...]
。如果您想在最后的 之后添加空行]
,这是可行的。但实际的树规范是由特殊的解析器读取的,需要在预期的位置找到正确的东西。如果它看不到尽头,它会提出异议]
。
尽管您不想要箭头,但您在删除它所依赖的库时在代码中留下了一个箭头。我删除了代码,因为它实际上没有绘制任何东西。
请注意,为了帮助构建树,最好注释掉coordinate
或circle, fill
添加for tree
,并将其替换为类似 的内容content/.option=level
,这会将 的编号放入level
节点中。您的层名称相当于level - 1
,因此您可以使用它们轻松识别需要调整哪些节点或是否需要添加或删除内容。或者您可以label/.option=level
将级别编号转换为标签。这会造成混乱,但会使开发树变得更加容易。通过将其放入 中,before typesetting nodes={before tree={}}
您在完成后只有一个地方可以注释掉或删除代码。
\documentclass[border=5pt,tikz]{standalone}
% ateb: https://tex.stackexchange.com/a/714832/ addaswyd o ateb: https://tex.stackexchange.com/a/713845/
\usepackage[linguistics]{forest}
\forestset{%
nice tree/.style={%
before typesetting nodes={%
for tree={% uncomment the next three lines and comment the following one for dots at nodes
% circle,
% fill,
% inner sep=1.5pt,
coordinate,
parent anchor=center,
child anchor=center,
calign=fixed edge angles,
},
},
},
double nice trees/.style={%
phantom,
s sep'+=100pt,
for children={nice tree},
},
triple dots/.style={%
edge path'={(!parent.parent anchor) -- node[pos=0.25,my dot] {} node [pos=0.5,my dot] {} node [pos=0.75,my dot] {} (.child anchor)},
edge+={draw=none},
!u.label={[name=\foresteoption{name}-label]right:$n$ carets},
!u.tikz+={%
\draw [dotted] (\foresteoption{name}-label) edge ([xshift=5pt]!uuu.east) -- ([xshift=5pt]!{last,last}.east) ;
},
},
/tikz/my dot/.style={fill,circle,inner sep=0.75pt},
}
\begin{document}
\begin{forest}
double nice trees,
[
[,tier=0
[,tier=2]
[,tier=1
[,tier=3]
[,tier=2
[,tier=4]
[,tier=3
[,phantom,tier=4
[,phantom,tier=5]
]
[,tier=5,triple dots
[,tier=7]
[,tier=6
[,tier=8
[,tier=10]
[,tier=9
[,tier=10,phantom]
]
]
[,tier=7
[,tier=8,phantom]
]
]
]
]
]
]
]
[,tier=0
[,tier=2]
[,tier=1
[,tier=3]
[,tier=2
[,tier=4]
[,tier=3
[,phantom]
[,tier=5,triple dots
[,tier=7]
[,tier=6
[,tier=8]
[,tier=7
[,tier=9]
[,tier=8
[,tier=9,phantom]
]
]
]
]
]
]
]
]
]
\end{forest}
\end{document}
Okular 有一个 bug,导致我的所有图片都很糟糕,所以我将上面的图片展示出来,以挑战读者的想象力。然而,它看起来确实很像 OP 问题中的那棵树。它的间距更大一些,角度也稍微柔和一些,所以看起来没那么瘦弱。(这显然可以改变——这就是它的效果。)