【问题标题】:GraphViz edge labelsGraphViz 边缘标签
【发布时间】:2010-10-24 06:19:27
【问题描述】:

我正在尝试使用 graphviz 绘制 C 头文件之间的依赖关系图。

基本上,我正在做的是记录所有出现的#include 和条件(我的意思是#if 条件)。如果一个文件包含另一个文件,它将成为它在图中的父亲,并且潜在的条件是边缘标签。

我得到一个相当大的图表。问题源于始终水平的边缘标签(您无法更改它)并且似乎总是左对齐(我尝试过 labelloc 和 labeljust 但它没有改变任何东西。“居中”的正确方法是什么一条边的标签。

为了避免这个问题,我尝试将条件渲染为节点。如果 Ah 在 ANSI 条件下包含 Bh,则存在从 Ah 到 ANSI,然后从 ANSI 到 Bh 的链接。这看起来不错,但问题是如果 Ch 在相同条件下包含 Dh,我会看到从 Ah 到 ANSI 的链接, 一个从到 Ch 到 ANSI;一个从 ANSI 到 B.h,一个从 ANSI 到 D.h。问题是我不知道是 A.h 还是 C.h 包含 B.h 。有没有办法指定诸如通过节点之类的东西(在 ANSI 下的从 A.h 到 B.h 的链接可能会利用透明度。)

【问题讨论】:

  • 您是否使用默认 rankdir (=TB?) 边缘标签有多长?
  • 是的,我正在使用默认的 rankdir...当您组合了多个配置选项时,标签可能会很长。这也是一个问题(但我可以用 \l 或 \n .. 添加新行)

标签: c graphviz data-visualization dot


【解决方案1】:

labelloc 和 labeljust 对边缘没有意义。请参阅here,它分别将“GC”表示为 Graph、Cluster 或“N”表示为 Node。

但是,您可以考虑为每个条件生成带有标签的唯一节点。然后会有多个节点具有不同的“点 ID”,但具有相同的标签(条件文本),因此很清楚是 A.h 还是 C.h 包含 B.h。我想你会对结果感到满意,因为你已经说过它看起来不错。

祝你好运!

【讨论】:

  • 感谢您的回答...这似乎是个好主意...我会试试这个
【解决方案2】:

我在使用具有相同标签的唯一节点方面取得了很多成功,具体取决于我所说明的内容。根据需要获得边缘标签居中错觉的一种有趣方法是使用 shape=plaintext 的节点。

您也可以使用它来提供一个连接点 - 如下所示,有许多边进出明文节点:

digraph joins {

node [shape=box weight=bold fontsize=18 color=black fontcolor=black]
edge [color=black fontcolor=black ]
graph[size="6,4",ratio=fill,center=1]

tblXXMaster[shape=record label="tblXXMaster | <f0>intMasterXXNumber | <f1>boolXXsPrinting"] 
set[shape=plaintext label="sets flag"]
setandclear[shape=plaintext label="sets next value\nand clears flag"]
setandclear->tblXXMaster:f0
setandclear->tblXXMaster:f1

set->tblXXMaster:f1
use[shape=plaintext label="uses current\nnumber"]
tblXXMaster:f0->use
XX[shape=plaintext label="XXs\nflag"]
tblXXMaster:f1->XX

"wndManualReceipt\n.procOne"->setandclear
"wndManualDebit\n.procOne"->setandclear
"wndApproveXXs\n.procOne\n.d005TempSetBitToZero"->setandclear
"wndPrintXXs\n.procZero\n.procOne"->setandclear
"wndUnapproveXXs\n.procZero\n.procOne"->setandclear
"wndWriteXXForMultipleInvoices\n.procOne\n.d005TempSetBitToZero"->setandclear
"wndWriteManualXX\n.procOne\n.procZero"->setandclear

"wndConfirmXXPrint\n.applyLock"->set
"wndConfirmMultiInvoiceXXPrint\n.applyLock"->set

use->"wndConfirmXXPrint\n.nextNumber"
use->"wndConfirmManualXXPrint\n.nextNumber"
use->"wndConfirmMultiInvoiceXXPrint\n.nextNumber"
XX->"wndConfirmManualXXPrint\n.doPrint"
XX->"wndConfirmMultiInvoiceXXPrint\n.doPrint"
}

【讨论】:

  • 问题是我有一个关系关系船。如果 ac 包含 ah 如果我有 CONFIG_X 并且 bc 包含具有相同 CONFIG_X 的 bh...我将有一个从 ac 到 CONFIG_X 的链接,一个从 bc 到 CONFIG_X 和两个从 CONFIG_X 到 ah 和 bh 的链接...通过查看graph 我怎么知道这是包含 ah 和 bh 的 ac 还是 bc?
  • 在这种情况下,我要么只使用 CONFIG_X 作为从 ac 到 ah 边缘的包含标签,要么如果您使用明文方法,则有两个明文节点 CONFIG_X_A 和 CONFIG_X_B 都带有 label=" CONFIG_X"。
猜你喜欢
  • 2017-06-17
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2014-06-12
  • 2023-03-22
  • 2019-06-19
相关资源
最近更新 更多