使用Graphviz绘制大型图形

70

我的女儿制作了一个与井字游戏类似的游戏。当然,当我和她们一起玩时,我会在脑海中进行暴力破解...

所以在午餐时间,我快速编写了一个小的Python脚本来“解决”这个游戏。我想以图形方式查看结果,因此生成了所有合法移动的dot文件:

我将数据粘贴在此处

当我尝试使用dot进行呈现时,它需要很长时间,并且在几个小时后我放弃了它。

如果使用neatosfdp进行呈现等操作,则需要几秒钟或更少的时间,但布局实际上无法阅读:

sfdp -x -Tpng data.dot > data.png

sfdp

neato -x -Tpng data.dot > data.png

neato

我希望生成的图片能够有数兆像素。

如何布局并呈现这样一个大图? 我可以考虑使用非dot建议,比如可以进行布局的Python库。

(相关链接)

补充: 我的 Python 脚本 可以解决游戏并生成 dot 文件


2
图中有多少个节点/边?你可以尝试使用http://gephi.org/。 - job
@gephi.org 上有744个节点和4361条边。我留下的一个点运行时刚刚在这个dot文件上发生了段错误。 - Will
1
@Will,你能对这个数据集的执行时间给出一些直觉吗? - jarandaf
4个回答

59

试一试:

sfdp -x -Goverlap=scale -Tpng data.dot > data.png

-Goverlap选项可以保持布局不变,但会等比例缩放元素以消除节点重叠。我使用该选项生成了一张大小为约77MB的PNG图片,在缩小查看时效果如下:

enter image description here


2
@will 我能够在GIMP中打开它,但速度很慢。您可以运行dot -Txxx以获取其他可用的输出格式列表。我还能够指定-Tx11来启动布局的交互式显示(滚轮缩放,中键拖动以平移)。 - job
1
是的,我无法获得任何查看它的东西,在信封背面,即使在16位RGB画布上,我也应该拥有RAM。我还简要地看了一下nip2,但实际上无法弄清楚如何保存文件...我只是承认失败,写了博客然后继续前进!谢谢http://williamedwardscoder.tumblr.com/post/35858593837/tic-tac-toe - Will
1
我看过一些查看巨大图像界面的实现,它们使用了类似于Google地图的技术,@Will。你试过其中任何一个吗?快速查看后,我发现GSV有源代码,以及那个巨大的xkcd漫画的可缩放版本。GSV页面上有一些将图像分割成瓦片的代码。 - Don Kirkby
6
怎样才能将它变成分层视图而不是圆形的? - omega
你能否提供一些关于生成所需时间的信息。 - Techdragon
显示剩余3条评论

10

您仍然可以使用Neato,但需要修改.dot文件并添加以下内容:[splines=true overlap=false]

您的文件应如下所示:

digraph luffarschack {
    graph [splines=true overlap=false];
    node [shape=none]; 
        ...here your nodes;
        ...here your edges;
}

如果您只在第二行中输入"graph [splines=true overlap=false]",而其他内容保持不变,则应该有效。


早期它打印出了“警告:一些带有边距(3.20,3.20)的节点接触 - 退回直线边缘”,然后在13分钟后,OSX弹出“强制退出”对话框,因为我的系统已经用完了16GB的RAM! 如果您能够运行它,我很想看到这个布局会产生什么样的结果? - Will
完成了...只需给我一个电子邮件地址,我将向您发送 .svg 文件(4 MB)...我在这里找不到上传选项。 - DanielBoloc
我的个人资料页面上有一个电子邮件地址,非常感谢! - Will
抱歉,以为它是公开可见的(varfar at yahoo co uk) - Will
这对我有所帮助,但我没有加入 splines=true,因为它非常慢。 - jnnnnn

6
除了其他答案之外,您可以使用像Gephi这样的其他工具。

Gephi是用于各种图形和网络的领先可视化和探索软件。 Gephi是开源且免费的。

可在Windows、Mac OS X和Linux上运行。


4

我发现在我的大型图表(svg)中,默认的-Kneato点处理速度过慢。最终我使用了

dot -Ksfdp -ooutput.svg -Tsvg input.dot

input.dot 是指输入点。

digraph {
    graph [overlap=false];
    a -> {b c d e f g}
    b -> {c e g x f}
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接