如何可视化更压缩的水平图

问题描述 投票:0回答:1

有一个图A:

digraph MyGraph {
    "OssInterface.Host" 
    "OssInterface"
    "OssInterface.CliApp"
    "OssInterface.UnitTests"
    "Services.Localization"
    "Services.Logging"
    "Services.Statistics"
    "Services.Statistics.DataServiceRepo"
    "Services.Statistics.Dto" 
    "Services.Utilities"
    
    "OssInterface.Host" -> "Services.Logging"
    "OssInterface.Host" -> "OssInterface"
    "OssInterface.Host" -> "Services.Utilities"
    "OssInterface.Host" -> "Services.Localization"
    "OssInterface.Host" -> "Services.Statistics.DataServiceRepo"
    "OssInterface.Host" -> "Services.Statistics"
    "OssInterface" -> "Services.Utilities"
    "OssInterface" -> "Services.Logging"
    "OssInterface.CliApp" -> "Services.Logging"
    "OssInterface.CliApp" -> "OssInterface.Host"
    "OssInterface.CliApp" -> "Services.Utilities"
    "OssInterface.CliApp" -> "OssInterface"
    "OssInterface.UnitTests" -> "OssInterface"
    "OssInterface.UnitTests" -> "Services.Logging"
    "Services.Localization" -> "Services.Logging"
    "Services.Statistics" -> "Services.Statistics.Dto"
    "Services.Statistics" -> "Services.Logging"
    "Services.Statistics.DataServiceRepo" -> "Services.Statistics"
    "Services.Statistics.DataServiceRepo" -> "Services.Statistics.Dto"
    "Services.Utilities" -> "Services.Logging"
}

通过可视化:

图B:

digraph MyGraph {
    subgraph "cluster_OssInterface.Host" {              
        "OssInterface.Host/OssInterface.Host"
        "OssInterface.Host/OssInterface.Host.Building"
        "OssInterface.Host/OssInterface.Host.Statistics"
    }
    subgraph "cluster_OssInterface" {
        "OssInterface/OssInterface"
        "OssInterface/OssInterface.Agent"
        "OssInterface/OssInterface.DataSources"
        "OssInterface/OssInterface.DataSources.GrpcStorages"
        "OssInterface/OssInterface.DataSources.HttpStorages"
        "OssInterface/OssInterface.Records"
        "OssInterface/OssInterface.Storage"
        "OssInterface/OssInterface.Storage.Cache"
        "OssInterface/OssInterface.Traps"
        "OssInterface/Common.Trees"
        "OssInterface/Common.Trees.Utils"
        "OssInterface/DataService.Proto.OssData"
    }
    subgraph "cluster_OssInterface.CliApp" {
        "OssInterface.CliApp/OssInterface.CliApp"
    }
    subgraph "cluster_OssInterface.UnitTests" {
        "OssInterface.UnitTests/OssInterface.UnitTests"
        "OssInterface.UnitTests/OssInterface.UnitTests.Fakes"
        "OssInterface.UnitTests/OssInterface.UnitTests.Storage"
        "OssInterface.UnitTests/OssInterface.UnitTests.Storage.Cache"
        "OssInterface.UnitTests/OssInterface.UnitTests.Traps"
    }
    subgraph "cluster_Services.Localization" {
        "Services.Localization/Services.Localization"
    }
    subgraph "cluster_Services.Logging" {
        "Services.Logging/Services.Logging"
    }
    subgraph "cluster_Services.Statistics" {
        "Services.Statistics/Services.Statistics"
    }
    subgraph "cluster_Services.Statistics.DataServiceRepo" {
        "Services.Statistics.DataServiceRepo/Services.Statistics.DataServiceRepo"
    }
    subgraph "cluster_Services.Statistics.Dto" {
        "Services.Statistics.Dto/Services.Statistics.Dto"
    }
    subgraph "cluster_Services.Utilities" {
        "Services.Utilities/Services.Utilities"
    }   
    
    "OssInterface.Host/OssInterface.Host.Building" -> "Services.Logging/Services.Logging"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface.Host/OssInterface.Host"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.Agent"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.Traps"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.Storage.Cache"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.Storage"
    "OssInterface.Host/OssInterface.Host.Building" -> "Services.Utilities/Services.Utilities"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.DataSources"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.Records"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/DataService.Proto.OssData"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.DataSources.GrpcStorages"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface/OssInterface.DataSources.HttpStorages"
    "OssInterface.Host/OssInterface.Host.Building" -> "Services.Localization/Services.Localization"
    "OssInterface.Host/OssInterface.Host.Building" -> "Services.Statistics.DataServiceRepo/Services.Statistics.DataServiceRepo"
    "OssInterface.Host/OssInterface.Host.Building" -> "OssInterface.Host/OssInterface.Host.Statistics"
    "OssInterface.Host/OssInterface.Host.Building" -> "Services.Statistics/Services.Statistics"
    "OssInterface.Host/OssInterface.Host" -> "Services.Statistics/Services.Statistics"
    "OssInterface.Host/OssInterface.Host" -> "OssInterface/OssInterface"
    "OssInterface.Host/OssInterface.Host" -> "OssInterface/OssInterface.Traps"
    "OssInterface.Host/OssInterface.Host.Statistics" -> "OssInterface/OssInterface.Agent"
    "OssInterface.Host/OssInterface.Host.Statistics" -> "Services.Statistics/Services.Statistics"
    "OssInterface.Host/OssInterface.Host.Statistics" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.Agent" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.Agent" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.Agent" -> "Services.Logging/Services.Logging"
    "OssInterface/OssInterface.Agent" -> "OssInterface/OssInterface.Traps"
    "OssInterface/OssInterface.DataSources.GrpcStorages" -> "OssInterface/OssInterface.DataSources"
    "OssInterface/OssInterface.DataSources.GrpcStorages" -> "OssInterface/DataService.Proto.OssData"
    "OssInterface/OssInterface.DataSources.GrpcStorages" -> "OssInterface/OssInterface.Records"
    "OssInterface/OssInterface.DataSources.GrpcStorages" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.DataSources.GrpcStorages" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.DataSources.HttpStorages" -> "OssInterface/OssInterface.DataSources"
    "OssInterface/OssInterface.DataSources" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.DataSources" -> "Services.Logging/Services.Logging"
    "OssInterface/OssInterface.DataSources" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface" -> "Services.Logging/Services.Logging"
    "OssInterface/OssInterface.Records" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.Storage" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.Storage" -> "Services.Logging/Services.Logging"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/OssInterface.DataSources"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/Common.Trees"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/OssInterface.Storage"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/OssInterface.Records"
    "OssInterface/OssInterface.Storage.Cache" -> "OssInterface/OssInterface.Traps"
    "OssInterface/OssInterface.Storage" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.Storage" -> "OssInterface/OssInterface.Agent"
    "OssInterface/OssInterface.Traps" -> "OssInterface/OssInterface"
    "OssInterface/OssInterface.Traps" -> "OssInterface/OssInterface.DataSources"
    "OssInterface/OssInterface.Traps" -> "OssInterface/OssInterface.Records"
    "OssInterface/OssInterface.Traps" -> "Services.Utilities/Services.Utilities"
    "OssInterface/OssInterface.Traps" -> "Services.Logging/Services.Logging"
    "OssInterface/OssInterface" -> "Services.Utilities/Services.Utilities"
    "OssInterface/Common.Trees" -> "OssInterface/Common.Trees.Utils"
    "OssInterface.CliApp/OssInterface.CliApp" -> "Services.Logging/Services.Logging"
    "OssInterface.CliApp/OssInterface.CliApp" -> "OssInterface.Host/OssInterface.Host"
    "OssInterface.CliApp/OssInterface.CliApp" -> "Services.Utilities/Services.Utilities"
    "OssInterface.CliApp/OssInterface.CliApp" -> "OssInterface/OssInterface"
    "OssInterface.CliApp/OssInterface.CliApp" -> "OssInterface.Host/OssInterface.Host.Building"
    "OssInterface.UnitTests/OssInterface.UnitTests" -> "OssInterface/OssInterface.DataSources"
    "OssInterface.UnitTests/OssInterface.UnitTests.Fakes" -> "OssInterface/OssInterface.Storage"
    "OssInterface.UnitTests/OssInterface.UnitTests.Fakes" -> "OssInterface/OssInterface"
    "OssInterface.UnitTests/OssInterface.UnitTests.Fakes" -> "Services.Logging/Services.Logging"
    "OssInterface.UnitTests/OssInterface.UnitTests.Fakes" -> "OssInterface/OssInterface.Traps"
    "OssInterface.UnitTests/OssInterface.UnitTests.Fakes" -> "OssInterface/OssInterface.Agent"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage.Cache" -> "OssInterface/OssInterface.Storage.Cache"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage.Cache" -> "OssInterface/OssInterface.Storage"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage.Cache" -> "OssInterface/OssInterface"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage" -> "OssInterface/OssInterface.Storage"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage" -> "OssInterface.UnitTests/OssInterface.UnitTests.Fakes"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage" -> "OssInterface.UnitTests/OssInterface.UnitTests"
    "OssInterface.UnitTests/OssInterface.UnitTests.Storage" -> "OssInterface/OssInterface.Storage.Cache"
    "OssInterface.UnitTests/OssInterface.UnitTests.Traps" -> "OssInterface/OssInterface.Traps"
    "OssInterface.UnitTests/OssInterface.UnitTests.Traps" -> "OssInterface/OssInterface.DataSources"
    "OssInterface.UnitTests/OssInterface.UnitTests.Traps" -> "OssInterface.UnitTests/OssInterface.UnitTests"
    "OssInterface.UnitTests/OssInterface.UnitTests.Traps" -> "OssInterface/OssInterface.Records"
    "OssInterface.UnitTests/OssInterface.UnitTests.Traps" -> "OssInterface/OssInterface"
    "OssInterface.UnitTests/OssInterface.UnitTests" -> "OssInterface/OssInterface.Traps"
    "OssInterface.UnitTests/OssInterface.UnitTests" -> "OssInterface/OssInterface"
    "OssInterface.UnitTests/OssInterface.UnitTests" -> "OssInterface.UnitTests/OssInterface.UnitTests.Fakes"
    "Services.Localization/Services.Localization" -> "Services.Logging/Services.Logging"
    "Services.Statistics/Services.Statistics" -> "Services.Statistics.Dto/Services.Statistics.Dto"
    "Services.Statistics/Services.Statistics" -> "Services.Logging/Services.Logging"
    "Services.Statistics.DataServiceRepo/Services.Statistics.DataServiceRepo" -> "Services.Statistics/Services.Statistics"
    "Services.Statistics.DataServiceRepo/Services.Statistics.DataServiceRepo" -> "Services.Statistics.Dto/Services.Statistics.Dto"
    "Services.Utilities/Services.Utilities" -> "Services.Logging/Services.Logging"
}

通过可视化: 使用 msagl 进行相同的图形可视化

在第一种情况下,graphviz 可视化了一个很好的图表。在第二种情况下,图表的宽度开始增长。第二种情况下的 graphviz 似乎忽略了集群之间的隐式连接并基于子节点创建标记。 Msagl 考虑了集群节点并创建了一个在可视化方面与第一个图非常相似的图。

在 graphviz 中是否可以达到与 msagl 中相同的结果?在 msagl 中可能不一样,但我希望收到水平压缩程度更高的图像。

graphviz graph-visualization
1个回答
0
投票

解决方案如下:

  • 使用样条=正交。这节省了样条边缘不需要的大量空间
  • 矩形节点 - 减少空间浪费
  • OssInterface 集群合并为一个父集群
  • 从节点标签中删除了常见文本
  • 标签、颜色等的其他调整
digraph MyGraph {
  node    [style=filled fillcolor=mistyrose shape=rect height=1.4] 
  graph   [fontcolor=red2 fontsize=16 newrank=true splines=ortho]
  nodesep=.9
  ranksep=.9

  subgraph cluster000{
    subgraph "cluster_OssInterface.Host" {
      label="OssInterface.Host"
      graph [color=red style=filled fillcolor=lightgrey]
        "OssInterface.Host"
        "OssInterface.Host.Building"
        "OssInterface.Host.Statistics"
    }
    subgraph "cluster_OssInterface.CliApp" {
      label="OssInterface.CliApp"
      graph [color=red style=filled fillcolor=lightgrey]
        "OssInterface.CliApp"
    }
    subgraph "cluster_OssInterface.UnitTests" {
      label="OssInterface.UnitTests"
      graph [color=red style=filled fillcolor=lightgrey]
        "OssInterface.UnitTests"
        "OssInterface.UnitTests.Fakes"
        "OssInterface.UnitTests.Storage"
        "OssInterface.UnitTests.Storage.Cache"
        "OssInterface.UnitTests.Traps"
    }

    subgraph "cluster_OssInterface" {
      label="OssInterface"
      graph [color=red style=filled fillcolor=lightgrey]
        "OssInterface"  
        "OssInterface.Agent"
        "OssInterface.DataSources"
        "OssInterface.DataSources.GrpcStorages"
        "OssInterface.DataSources.HttpStorages"
        "OssInterface.Records"  
        "OssInterface.Storage"
        "OssInterface.Storage.Cache"  
        "OssInterface.Traps"
        "Common.Trees"
        "Common.Trees.Utils"
        "DataService.Proto.OssData"
    }

  subgraph clusterServicesGathered {
    subgraph "cluster_Services.Localization" {
      label="Services.Localization"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Localization"
    }
    subgraph "cluster_Services.Logging" {
      label="Services.Logging"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Logging"
    }
    subgraph "cluster_Services.Statistics" {
      label="Services.Statistics"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Statistics"
    }
    subgraph "cluster_Services.Statistics.DataServiceRepo" {
      label="Services.Statistics.DataServiceRep"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Statistics.DataServiceRepo"
    }
    subgraph "cluster_Services.Statistics.Dto" {
      label="Services.Statistics.Dto"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Statistics.Dto"
    }
    subgraph "cluster_Services.Utilities" {
      label="Services.Utilities"
      graph [color=red style=filled fillcolor=lightgrey]
        "Services.Utilities"
    }   
  }    
  }

    "OssInterface.Host.Building" -> "Services.Logging"
    "OssInterface.Host.Building" -> "OssInterface"
    "OssInterface.Host.Building" -> "OssInterface.Host"
    "OssInterface.Host.Building" -> "OssInterface.Agent"
    "OssInterface.Host.Building" -> "OssInterface.Traps"
    "OssInterface.Host.Building" -> "OssInterface.Storage.Cache" 
    "OssInterface.Host.Building" -> "OssInterface.Storage"
    "OssInterface.Host.Building" -> "Services.Utilities"
    "OssInterface.Host.Building" -> "OssInterface.DataSources"
    "OssInterface.Host.Building" -> "OssInterface.Records"
    "OssInterface.Host.Building" -> "DataService.Proto.OssData"
    "OssInterface.Host.Building" -> "OssInterface.DataSources.GrpcStorages"
    "OssInterface.Host.Building" -> "OssInterface.DataSources.HttpStorages"
    "OssInterface.Host.Building" -> "Services.Localization" 
    "OssInterface.Host.Building" -> "Services.Statistics.DataServiceRepo" 
    "OssInterface.Host.Building" -> "OssInterface.Host.Statistics"
    "OssInterface.Host.Building" -> "Services.Statistics"
    "OssInterface.Host" -> "Services.Statistics"
    "OssInterface.Host" -> "OssInterface"
    "OssInterface.Host" -> "OssInterface.Traps"
    "OssInterface.Host.Statistics" -> "OssInterface.Agent"
    "OssInterface.Host.Statistics" -> "Services.Statistics"
    "OssInterface.Host.Statistics" -> "Services.Utilities"
    "OssInterface.Agent" -> "OssInterface"
    "OssInterface.Agent" -> "Services.Utilities"
    "OssInterface.Agent" -> "Services.Logging"
    "OssInterface.Agent" -> "OssInterface.Traps"
    "OssInterface.DataSources.GrpcStorages" -> "OssInterface.DataSources"
    "OssInterface.DataSources.GrpcStorages" -> "DataService.Proto.OssData"
    "OssInterface.DataSources.GrpcStorages" -> "OssInterface.Records"
    "OssInterface.DataSources.GrpcStorages" -> "OssInterface"
    "OssInterface.DataSources.GrpcStorages" -> "Services.Utilities"
    "OssInterface.DataSources.HttpStorages" -> "OssInterface.DataSources"
    "OssInterface.DataSources" -> "Services.Utilities"
    "OssInterface.DataSources" -> "Services.Logging"
    "OssInterface.DataSources" -> "OssInterface"
    "OssInterface" -> "Services.Logging"
    "OssInterface.Records" -> "OssInterface"
    "OssInterface.Storage" -> "OssInterface"
    "OssInterface.Storage" -> "Services.Logging"
    "OssInterface.Storage.Cache" -> "OssInterface.DataSources"
    "OssInterface.Storage.Cache" -> "Common.Trees"
    "OssInterface.Storage.Cache" -> "OssInterface.Storage"
    "OssInterface.Storage.Cache" -> "OssInterface"
    "OssInterface.Storage.Cache" -> "OssInterface.Records"
    "OssInterface.Storage.Cache" -> "OssInterface.Traps"
    "OssInterface.Storage" -> "Services.Utilities"
    "OssInterface.Storage" -> "OssInterface.Agent"
    "OssInterface.Traps" -> "OssInterface"
    "OssInterface.Traps" -> "OssInterface.DataSources"
    "OssInterface.Traps" -> "OssInterface.Records"
    "OssInterface.Traps" -> "Services.Utilities"
    "OssInterface.Traps" -> "Services.Logging"
    "OssInterface" -> "Services.Utilities"   
    "Common.Trees" -> "Common.Trees.Utils"
    "OssInterface.CliApp" -> "Services.Logging"
    "OssInterface.CliApp" -> "OssInterface.Host"
    "OssInterface.CliApp" -> "Services.Utilities"
    "OssInterface.CliApp" -> "OssInterface"
    "OssInterface.CliApp" -> "OssInterface.Host.Building"
    "OssInterface.UnitTests" -> "OssInterface.DataSources"
    "OssInterface.UnitTests.Fakes" -> "OssInterface.Storage"  
    "OssInterface.UnitTests.Fakes" -> "OssInterface"
    "OssInterface.UnitTests.Fakes" -> "Services.Logging"
    "OssInterface.UnitTests.Fakes" -> "OssInterface.Traps"
    "OssInterface.UnitTests.Fakes" -> "OssInterface.Agent"
    "OssInterface.UnitTests.Storage.Cache" -> "OssInterface.Storage.Cache" 
    "OssInterface.UnitTests.Storage.Cache" -> "OssInterface.Storage"
    "OssInterface.UnitTests.Storage.Cache" -> "OssInterface"
    "OssInterface.UnitTests.Storage" -> "OssInterface.Storage"
    "OssInterface.UnitTests.Storage" -> "OssInterface.UnitTests.Fakes"
    "OssInterface.UnitTests.Storage" -> "OssInterface.UnitTests"
    "OssInterface.UnitTests.Storage" -> "OssInterface.Storage.Cache"
    "OssInterface.UnitTests.Traps" -> "OssInterface.Traps"
    "OssInterface.UnitTests.Traps" -> "OssInterface.DataSources"
    "OssInterface.UnitTests.Traps" -> "OssInterface.UnitTests"
    "OssInterface.UnitTests.Traps" -> "OssInterface.Records"
    "OssInterface.UnitTests.Traps" -> "OssInterface"
    "OssInterface.UnitTests" -> "OssInterface.Traps"
    "OssInterface.UnitTests" -> "OssInterface"
    "OssInterface.UnitTests" -> "OssInterface.UnitTests.Fakes"
    "Services.Localization" -> "Services.Logging"
    "Services.Statistics" -> "Services.Statistics.Dto"
    "Services.Statistics" -> "Services.Logging"
    "Services.Statistics.DataServiceRepo" -> "Services.Statistics"
    "Services.Statistics.DataServiceRepo" -> "Services.Statistics.Dto"
    "Services.Utilities" -> "Services.Logging"
}

给予:

© www.soinside.com 2019 - 2024. All rights reserved.