21

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

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

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

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

http://linux.softpedia.com/screenshots/Graphviz_1.png
(来源:softpedia.com

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

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

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

谢谢!

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

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

最终状态机

4

4 回答 4

23

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

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

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

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

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

于 2010-02-18T23:49:59.533 回答
4

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

我最了解Gep​​hi(免责声明:我是开发人员)。

于 2012-04-25T22:31:53.637 回答
3

我知道有很多选择:

  • Prefuse - 他们有一个较旧的 Java 版本。最新版本是 Flash 并且有一些不错的布局。它被称为Prefuse Flare演示页面说明了它的一些布局功能。
  • JUNG 包括许多布局选项,以及强大的图形分析功能。这里有一些例子。
  • Networkx 还包括许多布局功能。其中一些在此处列出。
于 2010-02-17T03:23:16.330 回答
2

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

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

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

对于自动布局,TikZ 的graphdrawing库有一些非常巧妙的算法

这是手动布局的示例以及用于获取它的 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}
于 2014-10-26T09:35:25.797 回答