【问题标题】:How to color a specific path in a graphviz dot file using python如何使用python为graphviz点文件中的特定路径着色
【发布时间】:2021-08-14 19:16:13
【问题描述】:

您好,我正在使用 pydot 包在 python 中迭代一个点文件。我想为图中的所有节点和边着色,这些节点和边是特定节点的父节点到起始根。下面的图片描述了目标。

实际图表如下

假定给定节点为 _ZL3WTFv 的必需输出

Python 代码如下

import pydot
import sys

def Clean(inp):
    return inp.replace('"{', '').replace('}"', '')

def GetNode(path):
    graph = pydot.graph_from_dot_file(path)
    graph = graph[0]
    nodesList = graph.get_nodes() 
    for e in nodesList:
        tempAttr = e.get_attributes()
        print('Checking', Clean(tempAttr['label']))
        if Clean(tempAttr['label']) == '_ZL3WTFv':
            #how to mark all nodes & paths to the top level parents from here e.g. _ZL3WTFv          
            print('Node Found!')
            break

if len(sys.argv) > 1:
    GetNode(sys.argv[1])
else:
    print('Dot file path Missing!')

graphviz dot 文件代码如下

digraph "Call graph" {
    label="Call graph";

    Node0x163ebe0 [shape=record,label="{external node}"];
    Node0x163ebe0 -> Node0x163b270;
    Node0x163ebe0 -> Node0x1605360;
    Node0x163ebe0 -> Node0x16052c0;
    Node0x163ebe0 -> Node0x160e2a0;
    Node0x163ebe0 -> Node0x160e600;
    Node0x163ebe0 -> Node0x160eb00;
    Node0x160eb00 [shape=record,label="{_GLOBAL__sub_I_test.cpp}"];
    Node0x160eb00 -> Node0x163b200;
    Node0x163b200 [shape=record,label="{__cxx_global_var_init}"];
    Node0x163b200 -> Node0x163b270;
    Node0x163b200 -> Node0x16052c0;
    Node0x163b270 [shape=record,label="{_ZNSt8ios_base4InitC1Ev}"];
    Node0x163b270 -> Node0x163e480;
    Node0x1605360 [shape=record,label="{_ZNSt8ios_base4InitD1Ev}"];
    Node0x1605360 -> Node0x163e480;
    Node0x16052c0 [shape=record,label="{__cxa_atexit}"];
    Node0x16052c0 -> Node0x163e480;
    Node0x160e2a0 [shape=record,label="{main}"];
    Node0x160e2a0 -> Node0x160e310;
    Node0x160e310 [shape=record,label="{_ZL1Av}"];
    Node0x160e310 -> Node0x160e3b0;
    Node0x160e310 -> Node0x160e450;
    Node0x160e3b0 [shape=record,label="{_ZL1Bv}"];
    Node0x160e3b0 -> Node0x160e3e0;
    Node0x160e450 [shape=record,label="{_ZL1Gv}"];
    Node0x160e450 -> Node0x160e530;
    Node0x160e3e0 [shape=record,label="{_ZL1Cv}"];
    Node0x160e3e0 -> Node0x160e5d0;
    Node0x160e3e0 -> Node0x160e670;
    Node0x160e530 [shape=record,label="{_ZL1Mv}"];
    Node0x160e530 -> Node0x160e850;
    Node0x160e5d0 [shape=record,label="{_ZL3WTFv}"];
    Node0x160e5d0 -> Node0x160e600;
    Node0x160e670 [shape=record,label="{_ZL1Xv}"];
    Node0x160e670 -> Node0x160e750;
    Node0x160e600 [shape=record,label="{_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc}"];
    Node0x160e600 -> Node0x163e480;
    Node0x160e750 [shape=record,label="{_ZL1Yv}"];
    Node0x160e750 -> Node0x160e5d0;
    Node0x160e850 [shape=record,label="{_ZL1Nv}"];
    Node0x160e850 -> Node0x160e8f0;
    Node0x160e8f0 [shape=record,label="{_ZL1Ov}"];
    Node0x160e8f0 -> Node0x160e990;
    Node0x160e990 [shape=record,label="{_ZL1Pv}"];
    Node0x160e990 -> Node0x160ea30;
    Node0x160ea30 [shape=record,label="{_ZL1Sv}"];
    Node0x160ea30 -> Node0x160e5d0;
}

主要问题是我能够迭代图,但无法标记从根到所需节点的路径

【问题讨论】:

  • 1) 必须用 Python 完成吗? 2)只是这个图或其他? 3)你能保证没有循环吗?
  • 1) Python 不是必需的 2) 它必须支持其他图(动态) 3) 循环可能存在也可能不存在(不保证)

标签: python graphviz dot pydot


【解决方案1】:

我不使用 Python 界面,但快速阅读一下应该可以:
编写一个递归函数,使用 gv.firstingv.nextin 将传入的边追回根/父节点。从您的目标节点开始,然后离开。边走边给每个节点和边上色。还要跟踪节点,以免陷入循环

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2020-08-10
    • 2021-12-08
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多