C GraphViz边标签

C GraphViz边标签,c,graphviz,data-visualization,dot,C,Graphviz,Data Visualization,Dot,我试图使用graphviz绘制C头文件之间的依赖关系图 基本上,我所做的是记录所有出现的#包括和条件(#如果我是指条件)。如果一个文件包含另一个文件,则该文件将成为其在图形中的父文件,并且潜在的条件是边标签 我得到一张相当大的图。这个问题源于边缘标签总是水平的(你不能改变它),而且看起来总是左对齐的(我尝试了labelloc和labeljust,但它没有改变任何东西。如何正确地“居中”一条边缘的标签 为了避免这个问题,我尝试将条件渲染为节点。如果A.h在ANSI条件下包括B.h,那么有一个从A.

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

基本上,我所做的是记录所有出现的#包括和条件(#如果我是指条件)。如果一个文件包含另一个文件,则该文件将成为其在图形中的父文件,并且潜在的条件是边标签

我得到一张相当大的图。这个问题源于边缘标签总是水平的(你不能改变它),而且看起来总是左对齐的(我尝试了labelloc和labeljust,但它没有改变任何东西。如何正确地“居中”一条边缘的标签


为了避免这个问题,我尝试将条件渲染为节点。如果A.h在ANSI条件下包括B.h,那么有一个从A.h到ANSI的链接,然后是从ANSI到B.h的链接…看起来不错,但问题是,如果C.h在相同条件下包括D.h,我会看到一个从A.h到ANSI的链接,一个从A.h到C.h到ANSI的链接,一个从ANSI到B.h的链接,一个从A.h到B.h的链接m ANSI到D.h。问题是我不知道是A.h还是C.h包含B.h。有没有办法指定类似于遍历节点的内容(从A.h到B.h的链接在ANSI下可能会利用透明度。)

labelloc和labeljust对于边来说没有意义。请看,它分别将“GC”表示为图形,将“群集”或“N”表示为节点

您可以考虑为每个条件生成带有标签的唯一节点,然后会有多个节点具有不同的“点ID”,但会有相同的标签(条件文本)。,所以很清楚是

A.h
还是
C.h
包含了
B.h
。我想你会对结果感到满意,因为你已经说过它看起来不错


祝你好运!

我已经成功地使用了具有相同标签的唯一节点,这取决于我所演示的内容。一个有趣的方法是使用形状=纯文本的节点来获得边缘标签居中的错觉

您还可以使用它来提供一个连接点-有许多边连接到纯文本节点或从纯文本节点连接到纯文本节点,如下所示:

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"
}
有向图连接{
节点[形状=框重=粗体字体大小=18颜色=黑色字体颜色=黑色]
边缘[颜色=黑色fontcolor=黑色]
图[size=“6,4”,比率=填充,中心=1]
tblXXMaster[shape=record label=“tblXXMaster | intMasterXXNumber | boolXXsPrinting”]
set[shape=plaintext label=“sets flag”]
setandclear[shape=plaintext label=“设置下一个值\n并清除标志”]
设置并清除->tblXXMaster:f0
setandclear->tblXXMaster:f1
设置->tblXXMaster:f1
使用[shape=plaintext label=“使用当前\n编号”]
tblXXMaster:f0->使用
XX[shape=plaintext label=“XXs\nflag”]
tblXXMaster:f1->XX
“WNDManualReceivement\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”->设置并清除
“wndWriteManualXX\n.procOne\n.procZero”->setandclear
“wndConfirmXXPrint\n.applyLock”->set
“wndConfirmMultiInvoiceXXPrint\n.applyLock”->set
使用->“wndConfirmXXPrint\n.nextNumber”
使用->“wndConfirmManualXXPrint\n.nextNumber”
使用->“wndConfirmMultiInvoiceXXPrint\n.nextNumber”
XX->“WNDConfigrmManualXXPrint\n.doPrint”
XX->“wndConfirmMultiInvoiceXXPrint\n.doPrint”
}

您是否使用默认rankdir(=TB?)边缘标签有多长?是的,我使用默认rankdir…当您有多个配置选项组合时,标签可能相当长。这也是一个问题(但我可以使用\l或\n..添加新行)谢谢你的回答…这似乎是个好主意…我会试试这个问题是我有一个关系。如果a.c包括a.h如果我有配置X,b.c包括b.h和相同的配置X…我会有一个从a.c到配置X的链接,一个从b.c到配置X的链接,还有两个从配置X到a.h和b.h的链接…通过查看图表我知道这是包含a.h和b.h的a.c还是b.c吗?在这种情况下,我要么使用CONFIG_X作为从a.c到a.h的边缘上的include标签,要么使用纯文本方法,让两个纯文本节点CONFIG_X_a和CONFIG_X_b都带有label=“CONFIG_X”。