改进graphviz布局

时间:2010-02-17 02:59:44

标签: graphviz graph-layout graph-drawing

在制作图形时,我有完美的瘫痪。如果没有充分探索视觉的对称性,我很难理解正在发生的事情。我也是一个非常直观的学习者,我喜欢简化我刚学到的东西并将它们写在纸上。

Graphviz是一个自动绘制东西的好工具,但它可能会更好。让我们从一个好图(一个状态机)的例子开始。没关系质量(它可以用更好的工具重新绘制)这个几乎是完美的,除了我将它逆时针旋转45度以使对称明显。然后,它应该让读者花更少的时间来弄清楚状态q1和q2是如何相似以及它们在何处不同。我认为有一种最好的方式来表示该图表,因为它旁边没有其他图形。

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif

现在让我们来看一个不太完美的描述:

http://linux.softpedia.com/screenshots/Graphviz_1.png http://linux.softpedia.com/screenshots/Graphviz_1.png

这看起来像是graphviz会生成的东西。是的,边缘是光滑的,但GAAAAWWWD这是不必要的混乱!它看起来像一张思维导图,而不是一张准备好消费的完成图。我相信人眼CRAVE(不能少)对称。是的,等级制度等也是重要因素。

我很惊讶没有更好的算法可用。有些人根本不是视觉学习者;他们可以通过阅读符号来掌握抽象概念。不是我!

那么,我的问题是什么?那么,是否有更好的免费软件可用于绘制中小型图形?也许

谢谢!

让我知道如何改进这篇文章。

P.S。我花了10分钟在dia中画出一个类似的克隆。它仍然不是很完美,但它很方便制作,因为一切都按网格(我错过了一些小细节,但不想重新上传)。 LR_0需要“开始--->”从上面来,让用户尽快掌握起始状态。

Finate State Machine http://i47.tinypic.com/315e6w6.png

4 个答案:

答案 0 :(得分:21)

在多次尝试绘制图表并且未能获得您认为“最佳”的布局之后,您在这里提出了一个问题: 是否有“[b] etter自由软件[用于]绘制小 - 中等图形。“ 您评估布局算法的唯一标准是它们与”表示该图表的最佳方式“的接近程度。当然,“最好的”留给你决定。

这或多或少与尝试使用给定的编程语言解决问题,失败,然后要求更好的编程语言相同。

图形绘制算法的核心是优化程序,然后生成评估解决方案(这里的“解决方案”指的是每个节点的坐标,它们共同构成一个布局)。根据单个标准或一系列排序标准的最小化来评估这些解决方案 - 即,图的一个或多个属性的最小化 - 例如,交叉的边的总数,或距离的总和节点之间(或两者的组合,或这两者的一些加权组合),或与对称配置的接近程度。 Graphviz由六种不同的布局算法组成(dot neato,fdp,sfdp,twopi和circo)。其中,你似乎只使用了点;然而,twopi和circo可能是更好的选择,因为它们严格的对称约束似乎符合你自己对正确绘制图形的想法。

其次,你的问题的文字是针对“图表”和图形绘图,在阅读完整的描述之后,我不认为你的问题与这两个概念有任何关系。

除了一般的图形绘制算法(如graphviz)之外,还有许多特定于域的布局算法,例如,Hasse图(以顺序理论表示部分有序集),Barabasi-Albert图(无标度网络) )和鄂尔多斯 - 仁义(随机图)。这些算法中的每一个都根据域提供的标准和约束生成图形布局 - 这应该向您表明所有域中没有单一的“最佳”布局。虽然您在问题中使用了“图形”一词,但您的描述表明您的问题与绘图状态机有关 - 这是一种高度特殊的图形。一般的图形绘制算法通常很难绘制这种专用图形,因为算法对域没有任何了解。事实上,我不知道状态图的任何布局算法 - 就像流程图没有一个(不一样,但相似)。工作流程方面,您可以在graphviz中绘制图形,然后将其导入Omnigraffle进行微调 - 在Omnigraffle中,您将对节点和边缘位置进行细粒度控制。

答案 1 :(得分:3)

我知道有很多选择:

  • Prefuse - 他们有older Java version。最新版本是在Flash中,有一些很好的布局。它被称为Prefuse Flaredemo page说明了它的一些布局功能。
  • JUNG包含许多布局选项,以及强大的图形分析功能。有一些例子here
  • Networkx还包括许多布局功能。其中一些列在here

答案 2 :(得分:3)

一些软件允许用户实时调整布局算法,只要用鼠标移动节点即可。这种方法可以极大地帮助您处理更大的图形。

我大多知道Gephi(免责声明:我是开发者)。

答案 3 :(得分:1)

TikZ生成beautiful graph layouts。您可以使用手动布局来指定最小提示,也可以要求自动布局。默认值很好,并且存在钩子以调整到完美。

使用半手动布局,您不必声明每个细节,因为您可以

  • 相对于其他节点,将节点声明为','以及'以及'等等。
  • 将您的节点放在栅格上,方法是将它们作为矩阵输入:如果您想将某些位置留空,非常方便。
  • 轻松指定边缘应进入,离开,弯曲或转角的方向

对于自动布局,TikZ的graphdrawing库有一些pretty slick algorithms

以下是手动布局和用于获取它的TeX代码的示例:

example graph

\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
                    semithick]
  \tikzstyle{every state}=[fill=red,draw=none,text=white]

  \node[initial,state] (A)                    {$q_a$};
  \node[state]         (B) [above right of=A] {$q_b$};
  \node[state]         (D) [below right of=A] {$q_d$};
  \node[state]         (C) [below right of=B] {$q_c$};
  \node[state]         (E) [below of=D]       {$q_e$};

  \path (A) edge              node {0,1,L} (B)
            edge              node {1,1,R} (C)
        (B) edge [loop above] node {1,1,L} (B)
            edge              node {0,1,L} (C)
        (C) edge              node {0,1,L} (D)
            edge [bend left]  node {1,0,R} (E)
        (D) edge [loop below] node {1,1,R} (D)
            edge              node {0,1,R} (A)
        (E) edge [bend left]  node {1,0,R} (A);
\end{tikzpicture}
\end{document}