如何在 TiKz 中的节点之间添加水平箭头

如何在 TiKz 中的节点之间添加水平箭头

我一直在尝试重新创建这棵语言树,并尝试在 TiKz 中完成,但我也愿意接受其他解决方案。

但是,我不确定如何处理位于两个节点之间的水平箭头及其左侧的标签。

其次,我不确定最好的方法是让分支达到两级而不在中间插入节点。我改变了它的长度,但这会使兄弟距离有点不均匀。

第三,我的标签距离节点很远,我希望它们离节点更近一些。

语言树

这是我的最小工作示例。

\documentclass{article} 
\usepackage{forest}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[
level 1/.style={level distance=1cm,sibling distance=3cm},
level 2/.style={level distance=2cm,sibling distance=2cm},
level 3/.style={level distance=1.5cm,sibling distance=2cm}]
\tikzstyle{every node}=[circle,draw,fill,inner sep=0pt,minimum size=4pt]

\node (Root)[label=above:{\textsc{pucd}}] {}
    child { node[label=left:{pre-\textsc{puc}}] {}
    child { node[label=left:{\textsc{puc}}] {}
        child { node[label=below:{Uwahaza}] {} }
        child { node[label=below:{Cakaria}] {} }
    } }
    child { node[below=19mm,label=below:{Danundaga}] {} }
;
\end{tikzpicture}
\end{document}

最小结果

答案1

在此处输入图片描述

tikz溶液:

\documentclass{article}
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}[
level 1/.style={level distance=1cm,sibling distance=3cm},
level 2/.style={level distance=2cm,sibling distance=2cm},
level 3/.style={level distance=1.5cm,sibling distance=2cm},
V/.style = {circle, fill,inner sep=2pt}
                    ]
\node (Root)[V,label=above:{\textsc{pucd}}] {}
    child   { node (A) [V,label=left:{pre-\textsc{puc}}] {}
        child   { node (B) [V,label=left:{\textsc{puc}}] {}
            child { node[V,label=below:{Uwahaza}] {} }
            child { node[V,label=below:{Cakaria}] {} }
                }
            }
    child { node[V,below=19mm,label=below:{Danundaga}] {} }
;
\path (A) -- (B) node[pos=0.3] (p1) {} node[pos=0.5] (p2) {}  node[pos=0.7] (p3) {};
\draw[dashed, <-]   (p1) -- ++ (-1.2,0);
\draw[dashed, <-]   (p2) -- ++ (-1.2,0) node[left, align=right] {?????\\influence};
\draw[dashed, <-]   (p3) -- ++ (-1.2,0);
    \end{tikzpicture}
\end{document}

您的图片上的箭头和文本难以辨认,也不清楚它们应该是什么样子。但是,在我的 MWE 中,它们的位置和文本可以轻松更改。

答案2

但是,我不确定如何处理位于两个节点之间的水平箭头及其左侧的标签。

唯一的问题是如何正确定位节点。要做到这一点,最简单的方法是为树中的节点添加名称,并使用标准的 tikz 定位方法来放置文本和箭头。

其次,我不确定最好的方法是让分支达到两级而不在中间插入节点。我改变了它的长度,但这会使兄弟距离有点不均匀。

即使在图中,节点也可以放在特定位置。使用child { node[right of=another node, xshift=2cm,...]...将把节点放在与“另一个节点”相同的 Y 位置,无论它们在图中处于什么级别。

第三,我的标签距离节点很远,我希望它们离节点更近一些。

对于标签,您可以使用语法...,label={[below,yshift=1cm]{my label}}来控制其垂直(或水平)位置。

\documentclass{article} 
\usepackage{tikz}
\usepackage{forest}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}[
level 1/.style={level distance=1cm,sibling distance=3cm},
level 2/.style={level distance=2cm,sibling distance=2cm},
level 3/.style={level distance=1.5cm,sibling distance=2cm}]
% \tikzstyle{every node}=[circle,draw,fill,inner sep=0pt,minimum size=4pt]
% include a scope to limit the default node style
\begin{scope}[every node/.style={circle,draw,fill,inner sep=0pt,minimum size=4pt}]
  \node (Root)[label={[above,yshift=-0.2cm]{\textsc{pucd}}}] {}
    child { node[label=left:{pre-\textsc{puc}}] (pre-puc) {}
    child { node[label=left:{\textsc{puc}}] (puc) {}
        child { node[label={[below,yshift=0.3cm]{Uwahaza}}] {} }
        child { node[label={[below,yshift=0.3cm]{Cakaria}}] {} }
    } }
    child { node[right of=puc, xshift=2cm,label={[below,yshift=0.4cm]{Danundaga}}] {} }
    ;
\end{scope}
\node (non-og) at ([xshift=-2cm]$(pre-puc)!0.3!(puc)$) {non-og};
\node (influence) at ([xshift=-2cm]$(pre-puc)!0.7!(puc)$) {influence};
\draw[->,dashed] (non-og) -- (non-og-|puc);
\draw[->,dashed] ([yshift=0.05cm]influence.north east) -- ([yshift=0.05cm]influence.north-|puc);
\draw[->,dashed] ([yshift=-0cm]influence.east) -- ([yshift=-0cm]influence.east-|puc);
\draw[->,dashed] ([yshift=-0.05cm]influence.south east) -- ([yshift=-0.05cm]influence.south-|puc);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

这是另一个“简单的” TikZ 代码。 在此处输入图片描述

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\path
(0,0)       coordinate (A) node[above=2mm]{PUCD}
++(-150:2)  coordinate (B) node[left=2mm]{pre-PUCD}
++(-90:2.5) coordinate (C) node[left=2mm]{PUC}
+(-120:2)   coordinate (D) node[below=2mm]{Uwahaza}
+(-60:2)    coordinate (E) node[below=2mm]{Cakaria}
+(0:3.5)    coordinate (F) node[below=2mm]{Danundaga};

\draw (A)--(B)--(C)--(D) (C)--(E) (A)--(F);
\foreach \p in {A,B,C,D,E,F} \fill (\p) circle(1mm);

\path (B)--(C) 
coordinate[pos=.35] (L1) 
coordinate[pos=.5] (L2)
coordinate[pos=.65] (L3);
\draw[<-,dashed] (L1)++(180:.3)--+(180:1.5); 
\draw[<-,dashed] (L3)++(180:.3)--+(180:1.5);
\draw[<-,dashed] (L2)++(180:.3)--+(180:1.5) 
node[left,align=center]{non-dg\\influence};

\end{tikzpicture}
\end{document}

相关内容