Graphviz:更改子图簇内的节点间距

2023-12-28

经验丰富但不是 Graphviz 专家。

我分享的示例代码和图像是更大图表的一部分,我将其拉出来以使问题和示例更清晰。

该图是按等级分开的并且从左到右流动。在图像示例中,您可以看到三个等级和节点空间很好,但我想在子图中收紧它们。

我已经尝试了六种语法选项,但它们都不允许我缩小子图中节点之间的垂直距离,而其他地方则不允许。

不确定如何将节点隔离到子图集群。

感谢您的任何帮助。

digraph G {
    
    graph   [rankdir=LR, ranksep=.8, nodesep=.25];
    edge    [dir=forward, color=black];
    node    [shape=rectangle, fontsize=12, fontname="Times-Roman", height=.45];
    
    {edge [color=firebrick1]    v_Automobile    ->{"Locational"; "Consumption"; "Governmental"};};
    {edge [color=blue2]         v_Body          ->{"BioMetric"; "Networked IoT"; "Medical"};};
    {edge [color=darkviolet]    v_Citizen       ->{"Associative"; "Conversaional"; "Governmental"; "Political"};};
    {edge [color=lightskyblue]  v_Consumer      ->{"Consumption"; "Educational"; "Employment"; "Governmental"; "Locational"; "Medical"; "Transactional"};};
    {edge [color=crimson]       v_Home          ->{"Consumption"; "Emanative"; "Locational"; "Networked IoT"};};
    
    {edge [color=blue2]         "BioMetric"     ->{SP_Camera; SP_Apps; "CCTV"};};
    {edge [color=crimson]       "Consumption"   ->"Smart Meter"};
    {edge [color=blue2]         "Medical"       ->SP_Apps};
    {edge [color=darkviolet]    "Political"     ->"Ballot"};
    {edge [color=lightskyblue]  "Transactional" ->{SP_Browser; SP_Apps; "Reward Cards"; "Paypoint"};};
    
    subgraph cluster_SmartPhone {label = "Smart Phone"; 
            dirType=none;
            SP_Apps;
            SP_Browser;
            SP_Camera;
            SP_GPS};
            
    SP_Apps             [label="Apps",
                        height=.40,
                        color=black];
    SP_Browser          [label="Browser",
                        color=black];
    SP_Camera           [label="Camera",
                        color=black];
    SP_GPS              [label="GPS",
                        color=black];
                        
    v_Automobile        [label="Automobile",
                        penwidth=2,
                        color=firebrick1];                  
    v_Body              [label="Body",
                        penwidth=2,
                        color=blue2];
    v_Citizen           [label="Citizen",
                        penwidth=2,
                        color=darkviolet];
    v_Consumer          [label="Consumer",
                        penwidth=2,
                        color=lightskyblue];
    v_Home              [label="Home",
                        penwidth=2,
                        color=crimson];
    }

如果您确定要紧固的这些节点处于同一等级,则可以将它们替换为表格。在表格中,您可以删除外边框并设置细胞间距属性来控制单元格之间的距离。

要为这些伪节点创建边缘,您必须设置port属性到每个单元格,然后将这些端口引用为headport https://graphviz.gitlab.io/_pages/doc/info/attrs.html#d:headport属性或node:port syntax.

唯一的不便之处在于,您无法使用语法为包含这些伪节点的多个节点创建边node1 -> {pseudonode1;pseudonode2;node3}因为headport是边的属性。所以你必须单独声明这些边缘。

使用此技术的示例将如下所示:

digraph G {

    graph   [rankdir=LR, ranksep=.8, nodesep=.25];
    edge    [dir=forward, color=black];
    node    [shape=rectangle, fontsize=12, fontname="Times-Roman", height=.45];

    {edge [color=firebrick1]    v_Automobile    ->{"Locational"; "Consumption"; "Governmental"};};
    {edge [color=blue2]         v_Body          ->{"BioMetric"; "Networked IoT"; "Medical"};};
    {edge [color=darkviolet]    v_Citizen       ->{"Associative"; "Conversaional"; "Governmental"; "Political"};};
    {edge [color=lightskyblue]  v_Consumer      ->{"Consumption"; "Educational"; "Employment"; "Governmental"; "Locational"; "Medical"; "Transactional"};};
    {edge [color=crimson]       v_Home          ->{"Consumption"; "Emanative"; "Locational"; "Networked IoT"};};

    {edge [color=blue2]         "BioMetric"     -> tight:Camera;};
    {edge [color=blue2]         "BioMetric"     -> tight:Apps;};
    {edge [color=blue2]         "BioMetric"     ->{"CCTV"};};
    {edge [color=crimson]       "Consumption"   ->"Smart Meter"};
    {edge [color=blue2]         "Medical"       ->tight:Apps};
    {edge [color=darkviolet]    "Political"     ->"Ballot"};
    {edge [color=lightskyblue]  "Transactional" -> tight:Browser};
    {edge [color=lightskyblue]  "Transactional" -> tight:Apps;};
    {edge [color=lightskyblue]  "Transactional" -> {"Reward Cards"; "Paypoint"};};

    subgraph cluster_SmartPhone {label = "Smart Phone";
            dirType=none;
            tight [
                shape=none
                label=<
                    <table border="0" cellborder="1" cellspacing="10">
                        <tr>
                            <td port="Camera">Camera</td>
                        </tr>
                        <tr>
                            <td port="Apps">Apps</td>
                        </tr>
                        <tr>
                            <td port="Browser">Browser</td>
                        </tr>
                        <tr>
                            <td port="GPS">GPS</td>
                        </tr>
                    </table>
                >
            ]
    };


    v_Automobile        [label="Automobile",
                        penwidth=2,
                        color=firebrick1];
    v_Body              [label="Body",
                        penwidth=2,
                        color=blue2];
    v_Citizen           [label="Citizen",
                        penwidth=2,
                        color=darkviolet];
    v_Consumer          [label="Consumer",
                        penwidth=2,
                        color=lightskyblue];
    v_Home              [label="Home",
                        penwidth=2,
                        color=crimson];
}

Result:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Graphviz:更改子图簇内的节点间距 的相关文章

  • 如何使用 graphviz 绘制树图?

    我无法重现一个简单的例子 事情是这样的 import pandas as pd import numpy as np import sklearn as skl from sklearn import tree from sklearn c
  • 使用 pydot 绘制决策树

    我已经训练了一个决定tree Python字典 如下 现在我尝试使用它来绘制它pydot http code google com p pydot 在定义树 pydot 图 的每个节点时 我为其指定一个唯一 且详细 的名称和一个简短的标签
  • 平面图布局

    布局图形时有哪些边缘重叠最小化技术 最好与 GraphViz 相关 还有现有的软件可以以平面方式布局图形吗 当前布局 http www evecakes com doodles master gif http www evecakes co
  • 环边太长

    在下面的点图中 之间的边handleClick and onSelect in COLOROPTION太长了 如何将其变成紧密循环 如果也这样就更好了DIV离右边有点远COLOROPTION 循环边是option p4 e gt optio
  • 如何在Mac上打开点[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 首先 我是MacOS新手 我想要的是能够看到输出llc view dag combine1 dags sum ll 在Mac上 llc h
  • graphviz:记录带有粗体标题的节点

    我正在尝试使用 graphviz 来做一些类似于 UML 类图的事情 我想知道是否有一种方法可以使 register 样式的节点的第一个字段以粗体显示 以使其与其他字段不同 我的节点如下所示 digraph i node label
  • Graphviz .dot 节点排序

    我正在构建一个 epsilon NFA 来使用规范结构识别正则表达式 我使用子图对正则表达式的各个部分进行分组 运算符给我带来了特别的麻烦 因为 dot 决定移动节点的顺序 我尝试添加边缘权重以强制特定边缘变短以保持边缘的顺序一致 但这似乎
  • Graphviz 和 Brew doctor - 意外的 dylibs 错误

    刚刚做了一个brew install graphviz在 Mountain Lion 上 这给了我这个错误 错误 执行失败 make install graphviz rb 47 以为我只是卸载它 所以跑了brew uninstall gr
  • 如何在graphviz中强制Y坐标

    有没有办法在 graphviz 中使用 dot force y 位置 以像素或英寸为单位 The rank same不适合我的情况 The pos x y with Kfdp可能是一种方法 但我想让 GraphViz 确定 X位置 Than
  • 使用点语言在 Graphviz 中压缩有向图

    我正在尝试实现特定图 对称排列群的凯莱图 的可视化 就像此处所做的那样 但使 用 Graphviz 2 28 和 Dot source euclideanspace com http www euclideanspace com maths
  • 如何可视化 sklearn GradientBoostingClassifier?

    我训练过一个梯度提升分类器 http scikit learn org stable modules generated sklearn ensemble GradientBoostingClassifier html sklearn en
  • 以前没有发生过的访问冲突

    我正在 P 调用 Graphviz如图所示 http implicitoperator com blog 2009 12 24 rendering an in memory graphviz image with c html 当我写那篇博
  • graphviz 绘图太宽

    我正在做练习 在 jupyter 笔记本中使用 graphviz 创建决策树 然而 决策树过于宽泛 这是代码 from sklearn tree import export graphviz export graphviz tree out
  • GraphViz:未使用新安装程序设置 Windows PATH,从 R 调用时出现问题

    在 R 库中 我使用dot程序 来自 GraphViz 来生成一些图形 通常为 png 格式 dot是一个通常的可执行文件 我通过systemR 命令 到目前为止 一切都运行良好 因为 GraphViz 安装程序正在添加dot到 PATH
  • 如何使用 haskell graphViz 绘制图表

    我计划使用 Haskell graphViz 绘制图表 我是 Haskell 的新手 所以这对我来说相当困难 有人可以给我看一个简单的例子吗 实际上我需要一个非常简单的示例 以便我可以理解它并在我正在处理的场景中使用它 我在尝试安装 Cha
  • 将 doxygen 的图表从上到下方向翻转为从左到右

    doxygen 图为 includes and 包含在 创建的嵌套深度从上到下递增 使用 1 8 5 由于我们的图大多是带有许多节点的浅图 这会导致非常宽的图和丑陋的水平滚动条 有没有办法教 doxygen 以从左到右的方向创建这些图 就像
  • 将边权重传递给networkx中的graphviz_layout

    每个人都找不到如何将权重列表的属性名称传递给networkx中的graphviz layout 像这样的事情 nx spring layout G weight weight sum 但与nx graphviz layout G 也许有人会
  • 用于生成交互式图的 Java 库

    我想将我们的 SOA 服务可视化为图表 我们有商业服务和领域服务 gt domain service 1 e g business service 1 gt domain service 2 gt domain service 3 我目前使
  • Graphviz:除了标签之外,还在节点上添加标题

    在我的 Graphviz 图中 用 DOT 编写 我希望每个节点都有一个标签 但除此之外 我还希望某些节点有一个小标题 表示该节点的一些其他唯一值 例如 如果这是一个历史图 则节点的标签可能类似于 乔治 华盛顿的诞生 标题可能为 另请参阅
  • 在 GraphViz 中将多个短节点与单个高节点并行排列

    我想生成这样的东西 节点的对齐是重要的事情 而不是边缘的角度 V V lt alignment at top gt V gt lt alignment at

随机推荐