买者自负 ...

买者自负 ...

我目前正在尝试自动生成 Tikz 图形。如果图形包含 10 个节点,那么 Tikz 弹簧布局的自动布局创建功能非常棒。但是,如果图形中的节点数量增加,图形的缩放就会变得困难。我开始调整节点距离参数(对于节点数小于 20 的小图形来说,这很好),但我也尝试了其他参数,例如弹簧常数和电荷。

lualatex这是我对具有 10 个节点的图的MWE(运行):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{graphdrawing}
\usegdlibrary{force}
\definecolor{burntorange}{cmyk}{0,0.52,1,0}
\definecolor{violet}{cmyk}{0.79,0.88,0,0}
\def\oran{orange!30}
\tikzstyle{vertex}=[draw,circle,burntorange, left color=\oran,text=violet,minimum width=20pt]
\begin{document}


\begin{tikzpicture}[spring layout, node distance=50pt]
\node (0) [vertex] {0};
\node (1) [vertex] {1};
\node (2) [vertex] {2};
\node (3) [vertex] {3};
\node (4) [vertex] {4};
\node (5) [vertex] {5};
\node (6) [vertex] {6};
\node (7) [vertex] {7};
\node (8) [vertex] {8};
\node (9) [vertex] {9};
\path (0) edge[--] (1); 
\path (0) edge[--] (2); 
\path (0) edge[--] (3); 
\path (1) edge[--] (4); 
\path (3) edge[--] (5); 
\path (3) edge[--] (6); 
\path (2) edge[--] (7); 
\path (7) edge[--] (8); 
\path (5) edge[--] (9); 
\end{tikzpicture}

\end{document}

结果如下图 具有 10 个节点的图

现在,使用具有更多节点的更大的图,图就太紧密了: 包含 100 个节点的图

以下是具有 100 个节点的示例代码:

http://pastebin.com/LHjcee8Z

知道该改变什么吗?

谢谢你!

答案1

请注意,我对绘制图形一无所知......

买者自负 ...

我不确定您到底想要实现什么结果。但是,我不清楚您是否理解您尝试使用的代码。

spring layout使用算法来模拟图中节点之间的力的影响。每个力edge都是一个spring,它将节点推开或拉近,具体取决于它是被压缩还是被拉伸。如果你在图中增加了 100 个节点,并edge在它们之间添加了许多 s,那么想象一下作用在这些节点上的力的结果。一些会被拉到一起,一些会被推开。这将导致不同的力平衡和另一个循环。最终,系统将达到平衡。事实上,当然,TiZ 不一定会持续到这个点。相反,它会通过给定数量的循环(iterations)来跟踪系统的状态。

spring layout为与命令一起使用而设计\graph。您不必使用图形语法,但它更简洁。我将您的规范的开头翻译为更大的图形。

\begin{tikzpicture}
  \graph [spring layout, nodes={vertex}]
  {
    0 -- {1-- {2 -- 25,4,5-- {8 -- 12 -- 26,9-- 10 -- {18,20,22,23},11,24},6,7,16,17,21}, 3,13 -- 14,15,19}
    ;
  };
\end{tikzpicture}

影响结果的方法有很多种。例如,我尝试过

cooling factor=.1, convergence tolerance=.0001, node distance=25mm

这会导致节点间距更大

修改的弹簧布局

然而,请注意 TiZ 并不是简单地试图阻止节点相互重叠。相反,它试图展示您定义的弹簧将如何影响节点随时间的运动和位置。

您可以通过取出弹簧来直观地看到问题。

\begin{tikzpicture}
  \graph [nodes={vertex}, node distance=25mm]
  {
    0 -- {1-- {2 -- 25,4,5-- {8 -- 12 -- 26,9-- 10 -- {18,20,22,23},11,24},6,7,16,17,21}, 3,13 -- 14,15,19}
    ;
  };
\end{tikzpicture}

无弹性图

查看边缘,您可以想象当它们变成具有相同长度和刚度的弹簧时会发生什么。3、13、15、19 将被拉向 0。6、7、16、17、21 将被拉向 1。但是没有任何东西可以将这些节点彼此推开。

当然,我没有使用整个图,部分原因是我不想翻译它,部分原因是编译它已经花了很长时间。但请考虑节点之间的连接是否适合此算法。如果您需要一些连接到 0 的节点最终远离 0,而其他节点最终靠近 0,以便获得良好的结果,那么这可能不是您想要的布局。

\RequirePackage{luatex85}
\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{graphdrawing,graphs}
\usegdlibrary{force}
\definecolor{burntorange}{cmyk}{0,0.52,1,0}
\tikzset{% \tikzstyle is deprecated
  vertex/.style={draw, circle, burntorange, left color=orange!30, text=violet, minimum size=20pt},
}
\begin{document}
\begin{tikzpicture}
  \graph [spring layout, nodes={vertex}, cooling factor=.1, convergence tolerance=.0001, node distance=25mm]
  {
    0 -- {1-- {2 -- 25,4,5-- {8 -- 12 -- 26,9-- 10 -- {18,20,22,23},11,24},6,7,16,17,21}, 3,13 -- 14,15,19}
    ;
  };
\end{tikzpicture}
\begin{tikzpicture}
  \graph [nodes={vertex}, node distance=25mm]
  {
    0 -- {1-- {2 -- 25,4,5-- {8 -- 12 -- 26,9-- 10 -- {18,20,22,23},11,24},6,7,16,17,21}, 3,13 -- 14,15,19}
    ;
  };
\end{tikzpicture}
\end{document}

相关内容