Выделение зон на лесном дереве

Выделение зон на лесном дереве

Я хотел бы выделить разные зоны дерева разными цветами, разделив их дугообразной линией. Есть ли способ это сделать?

Результат, которого я хотел бы достичь, примерно такой:

введите описание изображения здесь

Код моего дерева следующий:

\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}

введите описание изображения здесь

Объяснение:

  • Сначала я рисую три эллиптические дуги, которые относительно расположены к узлам CP, TPи VPв дереве. Я делаю это, называя узлы в дереве с помощью nameопции, предоставляемой пакетом forest.
  • Я создаю четвертую дугу относительно узла (координаты), который находится точно на таком же расстоянии от VP, на каком VP находится от TP, но в противоположном направлении. Этот расчет можно выполнить с помощью библиотеки calcи синтаксиса $(vp)!-1!(tp)$.
  • Я называю эти четыре дуги, используя name path, а затем использую intersection segmentsопцию, предоставляемую библиотекой, fillbetweenкоторая поставляется с PGFplots (и которая подробно описана вруководство в настоящее время в разделе 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}

введите описание изображения здесь

Связанный контент