突出显示森林树中的区域

突出显示森林树中的区域

我想用不同的颜色突出显示树的不同区域,并用拱形线将它们分开。有办法吗?

我想要达到的结果大致如下:

在此处输入图片描述

我的树的代码如下:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{soul}
\usepackage{tikz}
\usepackage{forest}
\usepackage{ulem}
\usetikzlibrary{positioning,tikzmark}

\begin{document}

\begin{forest}
for tree={calign=fixed edge angles},
[CP [,phantom]
[C' 
[C]
[TP [,phantom]
[T' 
[T]
[VP [,phantom]
[V' 
[V] [,phantom]]]]]]]
\end{forest}

\end{document}

在此先感谢任何有解决方案的人!

答案1

使用该calc库和fillbetween提供的库进行一些技巧pgfplots,您可以执行以下操作(我认为这可能不是实现此目的的最简单方法):

\documentclass[border=10pt]{standalone}
\usepackage{forest}

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}

\usetikzlibrary{calc, backgrounds}

\begin{document}

\begin{forest}
for tree={calign=fixed edge angles},
[CP,name=cp [,phantom]
[C' 
[C]
[TP,name=tp [,phantom]
[T' 
[T]
[VP,name=vp [,phantom]
[V' 
[V] [,phantom]]]]]]]
\draw[rotate=30, name path=cpbow] ([shift={(150:2 and 0)}]cp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\draw[rotate=30, name path=tpbow] ([shift={(150:2 and 0)}]tp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\draw[rotate=30, name path=vpbow] ([shift={(150:2 and 0)}]vp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\path[rotate=30, name path=xpbow] ([shift={(150:2 and 0)}]$(vp)!-1!(tp)$) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\begin{scope}[on background layer]
\fill[red, opacity=0.25, intersection segments={
        of=cpbow and tpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\fill[yellow, opacity=0.25, intersection segments={
        of=tpbow and vpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\fill[green, opacity=0.25, intersection segments={
        of=vpbow and xpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\end{scope}
\end{forest}

\end{document}

在此处输入图片描述

解释:

  • 我首先绘制三个椭圆弧,它们与树中的CPTP和节点相对定位。我通过使用包提供的选项命名树中的节点来实现这一点。VPnameforest
  • 我创建了第四个相对于节点(坐标)的圆弧,该节点与 VP 的距离恰好等于 VP 与 TP 的距离,但方向相反。可以使用库calc和语法实现此计算$(vp)!-1!(tp)$
  • 我使用命名这四个弧,name path然后利用intersection segmentsfillbetweenPGFplots 附带的库手册目前在第 5.7 节) 在它们之间创建填充。
  • 我把三种填充物放在背景层上,这样它们就不会覆盖节点。

使用阴影的变化:

\documentclass[border=10pt]{standalone}
\usepackage{forest}

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}

\usetikzlibrary{calc, backgrounds}

\begin{document}

\begin{forest}
for tree={calign=fixed edge angles},
[CP,name=cp [,phantom]
[C' 
[C]
[TP,name=tp [,phantom]
[T' 
[T]
[VP,name=vp [,phantom]
[V' 
[V] [,phantom]]]]]]]
\draw[rotate=30, name path=cpbow] ([shift={(150:2 and 0)}]cp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\draw[rotate=30, name path=tpbow] ([shift={(150:2 and 0)}]tp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\draw[rotate=30, name path=vpbow] ([shift={(150:2 and 0)}]vp) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\path[rotate=30, name path=xpbow] ([shift={(150:2 and 0)}]$(vp)!-1!(tp)$) 
    arc[start angle=150, end angle=30, x radius=2, y radius=1];
\begin{scope}[on background layer]
\shade[left color=red!25, right color=red!0, shading angle=30, intersection segments={
        of=cpbow and tpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\shade[left color=yellow!25, right color=yellow!0, shading angle=30, intersection segments={
        of=tpbow and vpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\shade[left color=green!25, right color=green!0, shading angle=30, intersection segments={
        of=vpbow and xpbow, sequence={A* -- B*[reverse]}
    }] -- cycle;
\end{scope}
\end{forest}

\end{document}

在此处输入图片描述

相关内容