我正在使用带有力算法的图形绘制来放置节点和边,但由于某种原因,当使用 [spring layout] 时边不显示箭头。
在没有算法布局的情况下手动放置节点和边时,它可以正常工作。
我的问题是如何让弹簧布局像第二张 tikz 图片一样正确显示边缘箭头。
遵循 MWE。
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning, graphdrawing, quotes }
\usegdlibrary {force}
\tikzset{
node distance = 20mm,
provides/.style = {->},
every edge quotes/.style = {fill=white,sloped},
}
\begin{document}
\begin{tikzpicture}[spring layout]
\node [draw] (a) {A};
\node [draw] (b) {B};
\draw [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}
\begin{tikzpicture}
\node [draw] (a) {A};
\node [draw, below = of a] (b) {B};
\draw [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}
\end{document}
答案1
图形绘制库似乎没有向用户提供五种不同类型的边( --
、->
、<-
、<->
、 )。每条边都是一条边。(这与箭头尖端无关,这与边的方向有关,GD 库可能会以不同的方式解释这些方向。)-!-
--
edge
当实际绘制边时(其中->
表示箭头尖端规范),只有操作选项才会被转发到图形绘制算法。
所以你需要做
\path (a) edge [provides, "stuff"] (b);
甚至every edge
不会被考虑。
这是一个黑客这会重载一些样式,这些样式既设置箭头尖端也设置边缘类型。此 hack 不适用于edge from parent
(与child
操作一起使用)并且很可能破坏其他内容。
最好使用spring layout
例如也使用的适当的钩子。
代码
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning, graphdrawing, quotes}
\usegdlibrary {force}
\tikzset{
node distance = 20mm,
provides/.style = {->},
every edge quotes/.style = {fill=white, sloped}}
\makeatletter
\tikzset{
edge macro def/.code 2 args={%
\def\tikz@gd@plain@edge@macro##1##2{%
\pgfgdedge{\tikz@pp@name{\tikztostart}}{\tikz@pp@name{\tikztotarget}}{#1}{/tikz,#2,##1}{##2}}},
--/.style ={arrows=-, edge macro def= {--}{#1}},
->/.style ={arrows=->, edge macro def= {->}{#1}},
<-/.style ={arrows=<-, edge macro def= {<-}{#1}},
<->/.style={arrows=<->, edge macro def={<->}{#1}},
-!-/.style={arrows=-, edge macro def={-!-}{#1}, path only}}
\makeatother
\begin{document}
\begin{tikzpicture}[spring layout]
\node [draw] (a) {A};
\node [draw] (b) {B};
\path[provides] (a) edge ["stuff"] (b);
\end{tikzpicture}
\begin{tikzpicture}
\node [draw] (a) {A};
\node [draw, below = of a] (b) {B};
\path [provides] (a) edge ["stuff"] (b);
\end{tikzpicture}
\end{document}