【问题标题】:Improving graphviz layout改进graphviz布局
【发布时间】:2010-02-17 02:59:44
【问题描述】:

在制作图形时,我完全瘫痪了。如果没有充分探索视觉的对称性,我就很难理解发生了什么。我也是一个非常注重视觉的学习者,我喜欢简化我刚刚学到的东西并将它们画在纸上。

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


(来源:gallery.hd.org

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


(来源:softpedia.com

这看起来像是 graphviz 会生成的东西。是的,边缘是光滑的,但是 GAAAAWWWD 这是不必要的混乱!它看起来像一张思维导图,而不是一张可供使用的成品图。我相信人眼渴望(不少于)对称。是的,等级制度等也是重要因素。

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

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

谢谢!

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

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

【问题讨论】:

  • 你能用代码定义什么是“美”吗?您对没有更好的算法感到惊讶,但是在制作任意图时“更好”的定义并不完全明确:) 看起来您渴望对称,但您承认其他人可能更喜欢强调层次结构、平滑边缘等。
  • grahpviz 有很多选项可以更改布局、线条等(尽管很难从其文档中弄清楚事情是如何工作的)。你可以例如尝试将rankdir=LR; 添加到图表以更改布局
  • 在第一个图中,LR_2 还通过SS(a) 连接到LR_5,而在第二个图中,它通过S(A) 连接到另一个名为LR_2 的节点。

标签: graphviz graph-layout graph-drawing


【解决方案1】:

在多次尝试绘制图表但未能获得您认为“最佳”的布局后,您在这里提出了问题:是否有“[b]etter free software [for] drawing small-到中型图。” 您给出的评估布局算法的唯一标准是它们与“表示该图的[s]单一最佳方式”的接近程度。当然是“最佳”,由您决定。

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

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

其次,您的问题文本针对“图表”和绘图,在阅读了您的完整描述后,我认为您的问题与这两个概念都没有任何关系。

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

【讨论】:

    【解决方案2】:

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

    我主要知道Gephi(声明:我是开发人员)。

    【讨论】:

      【解决方案3】:

      我知道有很多选择:

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

      【讨论】:

        【解决方案4】:

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

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

        • 将节点声明为相对于其他节点的“上方”、“右下方”等。
        • 通过将节点作为矩阵输入来将它们放置在栅格上:如果您想将某些位置留空,非常方便。
        • 轻松指定边缘应进入、离开、弯曲或拐角的方向

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

        这里是一个手动布局的例子和用来获取它的 TeX 代码:

        \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}
        

        【讨论】:

        • 什么是 TikZ?它是 LaTeX 的一些软件包吗?乳胶是免费的吗? Homebrew 不知道“tlmgr”公式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 2018-08-09
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多