我开始相信 tikz 并不适合我......
我怎么会弄错呢:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc,trees,mindmap,backgrounds,shadows}
\begin{document}
\begin{tikzpicture}
\path[mindmap,concept,concept color=red] (0,0) node (languages) {Languages} [clockwise from=90]
child { node {Markdown} }
child[ sibling angle=110, level distance=8cm] { node {R} [clockwise from=130]
child[ level distance = 4cm] { node {control structures (if, for, \mbox{while, repeat,} \mbox{next, break)}} }
child[ sibling angle = 90, level distance=6cm] { node {data types} [clockwise from=110]
child { node {vectors} }
child { node {lists} }
child { node {matrices} }
child { node {data frames} }
child { node {factors} }
child { node {dates} }
child { node {time} }
child { node {data.table} }
child { node {missing values} }
}
child[ sibling angle = 20] { node {functions} }
}
child[sibling angle=130] { node {RMarkdown} }
;
\end{tikzpicture}
\end{document}
为什么“函数”与“数据类型”不是 20 度?同级角度如何工作?(阅读手册没有帮助)
什么不起作用
不起作用 1
Mark Wibrow 的回答很棒……或者对我来说会很棒。在详细介绍他的功能之前,我应该分享一个对我来说不起作用的更基本的示例:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\begin{document}
\begin{tikzpicture}[mindmap, concept color=blue!20, every child node/.style={concept}]
\node[concept] (languages) {O} [clockwise from=90, sibling angle=90]
child { node {A} }
child { node {B} }
child { node {C}
child { node {C1} }
child { node {C1} }
child { node {C1} }
}
child { node {D} };
\end{tikzpicture}
\end{document}
不起作用 2 - 奇怪的结果变化
small mindmap
而 则与mindmap
Mark Wibrow 的结果很相似(尽管这可能是偶然的):
不起作用 3 - Mark Wibrow 的代码
使用 Mark Wibrow 的最后一段代码会得到他所显示的结果,但如果我将其更改[clockwise from=0, sibling angle=45]
为[clockwise from=0, sibling angle=10]
C1 节点的结果不会改变。
最好的办法
经过反复尝试,我认为最好的方法是使用类似 Mark Wibrow 的角度列表,但不使用绝对值,而是列表包含从每个节点到前一个节点的角度。例如,将(七个节点)[grow cyclic list={120,70,40,5,-30,-80,-100}]
改为[grow cyclic list={120,-50,-30,-35,-35,-50,-20}]
。
答案1
从手册中看并不是很清楚(如果有的话),但是当使用键时,子节点的clockwise from
角度基本上是:B
B = A - (n-1)*s
其中A
是起始角度,n
是当前子节点的编号,s
是兄弟节点角度的当前值(可以全局、本地或级别设置,或每个子节点样式设置)。因此,如果起始角度为 ,而兄弟节点角度在第三个子节点的子选项中A=130
设置为( ),则节点的角度为,我认为这就是您得到的结果。s=20
n=3
B=130-(3-1)*20=90
因此,如果您使用clockwise from
键并且希望n
第个子节点以特定角度出现B
,则兄弟角度s
应设置为:
s = (A - B) / (n-1)
令人困惑?好吧,也许吧。但在这种情况下,可能更有用的是子选项中给出的grow cyclic absolute
键,其中给出了子项的绝对角度。sibling angle
sibling angle
必须为每个子节点提供(否则它将是当前范围内设置的兄弟角度),但仍可以为(曾,......)孙子安装其他增长函数。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\tikzset{grow cyclic absolute/.style={%
growth function=\tikzgrowcyclicabsolute}}
\def\tikzgrowcyclicabsolute{%
\pgftransformshift{%
\pgfpointpolar{\pgfkeysvalueof{/tikz/sibling angle}}%
{\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,
every child node/.style={concept}]
\node [concept] (languages)
{O} [grow cyclic absolute]
child [sibling angle=90] { node {A} }
child [sibling angle=0] { node {B} }
child [sibling angle=-45] { node {C}
[clockwise from=0, sibling angle=45]
child { node {C1} }
child { node {C1} }
child { node {C1} }
}
child [sibling angle=210] { node {D} };
\end{tikzpicture}
\end{document}
为了避免因无尽的兄弟角度而使子代码混乱的烦恼,grow cyclic list
可以使用替代增长函数来在增长函数设置时指定增长角度:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\tikzset{grow cyclic list/.code={%
\def\tikzgrowthpositions{{#1}}%
\foreach \n [count=\i,remember=\i]in {#1}{}%
\let\tikzgrowthpositionscount=\i%
\tikzset{growth function=\tikzgrowcycliclist}}}
\def\tikzgrowcycliclist{%
\pgftransformshift{%
\pgfpointpolar{\tikzgrowthpositions[mod(\the\tikznumberofcurrentchild-1,\tikzgrowthpositionscount)]}%
{\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,
every child node/.style={concept}]
\node [concept] (languages)
{O} [grow cyclic list={90,0,-45,210}]
child { node {A} }
child { node {B} }
child { node {C}
[clockwise from=0, sibling angle=45]
child { node {C1} }
child { node {C1} }
child { node {C1} }
}
child { node {D} };
\end{tikzpicture}
\end{document}
结果和以前一样。
绝对指定角度的优点是可以将任何角度预处理为绝对角度。下面演示了一个例子,给定一个起始角度,角度之间可以在列表中指定兄弟节点。此列表已预处理为绝对角度。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{trees,mindmap}
\makeatletter
\tikzset{%
grow clockwise/.code args={first at #1 then turning #2}{%
\pgfmathparse{#1}%
\let\tikzgrowthpositions=\pgfmathresult%
\let\tikz@tmpangle=\pgfmathresult%
\c@pgf@counta=1\relax%
\pgfutil@for\tikz@tmp:=#2\do{%
\advance\c@pgf@counta by1\relax%
\pgfmathparse{Mod(\tikz@tmpangle-\tikz@tmp, 360)}%
\let\tikz@tmpangle=\pgfmathresult%
\edef\tikzgrowthpositions{\tikzgrowthpositions,\tikz@tmpangle}%
}%
\edef\tikzgrowthpositions{{\tikzgrowthpositions}}%
\edef\tikzgrowthpositionscount{\the\c@pgf@counta}%
\tikzset{growth function=\tikzgrowcycliclist}%
}}
\def\tikzgrowcycliclist{%
\pgftransformshift{%
\pgfpointpolar{\tikzgrowthpositions[mod(\the\tikznumberofcurrentchild-1,\tikzgrowthpositionscount)]}%
{\the\tikzleveldistance}}}
\begin{document}
\begin{tikzpicture}[small mindmap, concept color=blue!20,
every child node/.style={concept}]
\node [concept] (languages)
{O} [grow clockwise={first at 90 then turning 90,45,105}]
child { node {A} }
child { node {B} }
child { node {C}
[clockwise from=0, level 2/.append style={sibling angle=60}]
child { node {C1} }
child { node {C1} }
child { node {C1} }
}
child { node {D} };
\end{tikzpicture}
\end{document}
结果和以前一样。