我在 tikz 中用 graph 库输出了如下 node:
\begin{tikzpicture}[x=2cm]
\graph{
{a,b,c}--{a1,b1,c1}--{a2,b2,c2}
};
\end{tikzpicture}
结果:
这样可以输出等间距(水平和垂直)排布的 node,请问如何在 graph 下自定义 node 的水平和垂直间距,得到不等距的node?
或者还有什么方法(库),可以简化输出矩阵排布的 node,同时输出 node之间的连线(draw或者 edge)而且 node 之间的间距可以自定义?谢谢。
你没有用具体例子来详细表达问题,我也不好猜测你具体需要什么。还是建议你先去读一下手册。
我对 graph 库的理解是这样的。
用户可以用一些变量(参数,其实就是 pgf 的 key),来定义一种计算 node 位置的方法,这些变量例如
\tikzgraphsset{
placement/.cd,
element count/.initial=0,
chain count/.initial=0,
depth/.initial=0,
width/.initial=0,
level/.initial=0,
logical node depth/.code=\def\pgfmathresult{1},
logical node width/.code=\def\pgfmathresult{1},
}%
Graph 库的作者利用这些变量定义了几种计算方式,默认的是 /tikz/graphs/Cartesian placement
这个计算方式。对于这个计算方式来说,用户可以通过调整某些 key 的值(如 /tikz/graphs/chain shift
)来影响这个计算方式的计算结果,但计算方式的框架是不容易修改的。
详细情况请参考手册。
也可以使用 graphdrawing 库引入其他的计算方式,这个库借助 lua 来计算,我不懂 lua。熟悉 lua 的用户可以自己编写一种计算方式。
总之 graph 库以及 graphdrawing 库强调的是“自动计算,自动排布”,非常依赖算法,而不是强调人工干预。如果总是期望用户来控制各个 node 的位置,那就背离了这个思想。所以这个思想主要针对有很多 node 的情况。当然用户也可以根据情况来调整个别 node 的位置,但这不是重点。
在 node 比较多的情况下,并没有绝对的标准来判断一种排布方式是否足够美观,减少用户的干预也未必不是一个好的选择。当然这对算法的设计也就有相当的要求,不是那么轻易就能设计好。例如命令 \usegdlibrary{force}
引入的算法就参考了数篇论文。你可以搜索相关的资料,例如 胡一凡 的作品
如果你想知道如何用参数调整算法的计算结果,应该先去阅读手册,或者手册中给出的参考论文。如果你觉得英文手册不好读,倒是也有关于 graph 库的中文介绍,也不太好读。不过,只要静心读,总能读明白。
谢谢您的解答。我的目的是希望在现有的 graph 中能够加入改变 node 间距的选项,现在的 graph 是排布等间距的 node,不论水平还是垂直方向。就正如我问题中的那个例子。但现在看来想要修改原本的设置似乎不太容易,当然可以自己仿造 graph 设置一种排布 node 的方式,但这对我来说很困难。因而如果 graph 中本身没有可以修改间距的选项的话,那我只能使用原本设置的了。
@u26254
最简单的办法就是重新规定
/tikz/graphs/chain shift
,/tikz/graphs/group shift
这两个选项的值,关于/tikz/graphs/Cartesian placement
的计算方式,可以在这个文章里找一下。@u817 谢谢您