我想使用 Forest 包创建如下所示的树形图。我知道可以使用 Tikz 包生成这棵树,但我想练习和学习 Forest 包。
那么,有人可以帮忙吗?
答案1
我也在学习forest
.这是我的尝试
\documentclass{article}
\usepackage{forest}
\usetikzlibrary{shadows,arrows.meta}
\tikzset{parent/.style={align=center,text width=2cm,fill=green!20,rounded corners=2pt},
child/.style={align=center,text width=2.8cm,fill=green!50,rounded corners=6pt},
grandchild/.style={fill=pink!50,text width=2.3cm}
}
\begin{document}
\begin{forest}
for tree={%
thick,
drop shadow,
l sep=0.6cm,
s sep=0.8cm,
node options={draw,font=\sffamily},
edge={semithick,-Latex},
where level=0{parent}{},
where level=1{
minimum height=1cm,
child,
parent anchor=south west,
tier=p,
l sep=0.25cm,
for descendants={%
grandchild,
minimum height=0.6cm,
anchor=150,
edge path={
\noexpand\path[\forestoption{edge}]
(!to tier=p.parent anchor) |-(.child anchor)\forestoption{edge label};
},
}
}{},
}
[Drawing\\diagrams
[Defining node and arrow styles
[Setting shape
[Choosing color
[Adding shading]
]
]
]
[Positioning the nodes
[Using a Matrix
[Relatively
[Absolutely
[Using overlays]
]
]
]
]
[Drawing arrows between nodes
[Default arrows
[Arrow library
[Resizing tips
[Shortening
[Bending]
]
]
]
]
]
]
\end{forest}
\end{document}
答案2
因为据说熟能生巧。(但请注意,我相信这只适用于那些实践的人,如果它确实适用的话。)
我曾经cantarell
尝试捕捉原始图表中的字体感觉,即让树比 Computer Modern 提供的默认树看起来更随意一些。颜色大多是使用 的xcolor
列表选择的x11names
。
这里唯一真正的技巧是意识到粉色节点需要占据多个级别(每个子树的每个节点一个级别),并使节点和边缘样式对不同级别敏感。您可以逐个节点传递自定义样式定义,但按级别进行传递可以更轻松地维护和调整代码。
我使用了轻微的阴影来尝试为节点增加一点深度。但是,如果您不喜欢,可以轻松将其删除。
\PassOptionsToPackage{x11names,rgb}{xcolor}
\documentclass[border=5pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta, shapes.geometric, calc, shadows}
\usepackage[default]{cantarell}
\usepackage[T1]{fontenc}
\colorlet{linecol}{black!75}
\begin{document}
\pgfkeys{/forest,
my rounded corners/.append style={rounded corners=2pt},
}
\begin{forest}
for tree={
font=\sffamily,
line width=1pt,
draw=linecol,
drop shadow,
fit=rectangle,
edge={thick, color=linecol, >={Triangle[]}, ->},
where level=0{%
l sep+=5pt,
calign=child,
calign child=2,
inner color=PaleGreen1!80,
outer color=PaleGreen1,
align=center,
my rounded corners,
for descendants={%
calign=first,
},
}{%
where level=1{%
inner color=Green2!80,
outer color=Green2,
my rounded corners,
align=center,
parent anchor=south west,
tier=three ways,
for descendants={%
child anchor=west,
parent anchor=west,
align=left,
anchor=west,
inner color=MistyRose1!80,
outer color=MistyRose1,
edge path={
\noexpand\path[\forestoption{edge}]
(!to tier=three ways.parent anchor) |-
(.child anchor)\forestoption{edge label};
},
},
}{}%
},
}
[Drawing\\Diagrams
[Defining node\\and arrow styles
[Setting shape
[Choosing colour
[Adding shading]
]
]
]
[Positioning\\the nodes
[Using a matrix
[Absolutely
[Relatively
[Using overlays]
]
]
]
]
[Drawing arrows\\between nodes
[Default arrows
[Arrow library
[Re-sizing tips
[Shortening
[Bending]
]
]
]
]
]
]
\end{forest}
\end{document}
我不确定这样绘制树的优点。我不太喜欢圆角和直角的组合,尤其是考虑到当在第 1 级节点的西南角和第 2 级节点之间绘制边缘时会导致间隙。我也不清楚颜色。有两种不同的绿色和 1 种粉红色。这重要吗?浅绿色和深绿色是否相关,但不如粉红色那么紧密?我知道浅绿色是主要类别,深绿色是子类别。但粉红色似乎并非都是独特或明确界定的子子类别。(为什么选择箭头样式与绘制箭头无关?)但也许我只是在过度思考 MWE......