【问题标题】:How to visualize a graph made with igraph in C?如何在 C 中可视化使用 igraph 制作的图形?
【发布时间】:2018-07-15 15:59:35
【问题描述】:

我开始学习 C 语言的 igraph,我想知道如何可视化使用这个库制作的图形。我已经看到使用 igraph R 只需使用 plot 函数并绘制图形,但如果我使用 C,我应该将图形打印到文件中,然后使用另一个程序将其可视化还是通常的方式?

谢谢!

编辑:This 一种图表。

【问题讨论】:

    标签: c plot igraph


    【解决方案1】:

    按照Unix philosophy,让您的程序输出图形的描述(以文本格式,或者如果没有纯文本格式容易获得,则以易于处理的形式)。

    (请注意,这也适用于图像格式;NetPBM(.pnm 或 .pbm、.pgm 和 .ppm)格式很容易在纯 C 中生成(例如标准输出),如有必要, NetPBM 工具可用于转换为您可能希望的任何其他图像格式。)

    例如,如果你的程序输出

    graph {
        rankdir=LR;
        "6" -- "4";
        "4" -- "5";
        "3" -- "4";
        "3" -- "2";
        "5" -- "2";
        "5" -- "1";
        "2" -- "1";
    }
    

    然后将输出重定向到例如output.dot 并运行 dot -Tx11 output.dot 将输出类似于 Wikipedia Graph 文章中所示的图形,


    您提到您正在使用 igraph,幸运的是,该库已经支持以 DOT 格式编写图形。见the igraph_write_graph_dot() function


    DOT 语言指定为here,但它确实非常简单。 -- 表示无向边,-> 表示有向边。 rankdir=LR; 线是一个图形属性,它告诉 DOT 它应该尝试对从左到右看到的节点进行排序。默认是从上到下。您也可以添加节点属性,例如"6" [ label="Six" ]; 会将节点"6" 的标签更改为Six。边缘属性的工作方式完全相同;所以使用"2" -- "1" [ taillabel="Z" ]; 在节点“2”和“1”之间的边的节点“2”端附近添加“Z”。最好引用节点名称,即使如果节点名称以字母开头并且与图形属性名称不匹配,则不需要引号。


    在打印树或链表时,这里有一个有用的提示:

    使用%p(指向节点的指针)作为节点名称,label="value" 将节点的可见标签设置为value。例如,如果您有

    struct node {
        struct node  *left;
        struct node  *right;
        int           value;
    };
    

    然后是一个简单的函数对,

    void print_tree_recursive(FILE *out, struct node *curr)
    {
        fprintf(out, "    \"%p\" [ label=\"%d\" ];\n", (void *)curr, curr->value);
        if (curr->left) {
            print_tree_recursive(out, curr->left);
            fprintf(out, "    \"%p\" -> \"%p\" [ taillabel="L" ];\n", curr, curr->left);
        }
        if (curr->right) {
            print_tree_recursive(out, curr->right);
            fprintf(out, "    \"%p\" -> \"%p\" [ taillabel="R" ];\n", curr, curr->right);
        }
    }
    
    void print_tree(FILE *out, struct node *tree)
    {
        fprintf(out, "digraph {\n");
        if (tree)
            print_tree_recursive(out, tree);
        fprintf(out, "}\n");
        fflush(out);
    }
    

    将打印任何树的漂亮有向图。很容易修改打印链表(单链和双链)。请注意帮助函数如何首先描述节点(带有label= 的fprintf)和分别描述边缘(带有taillabel= 的fprintfs)。

    如果您将图表打印到标准输出,您可以将输出重定向到文件并显示或使用dot -Tformat filename 转换它,或者您可以将输出直接通过管道传送到| dot -Tx11 以查看生成的图表。

    我经常使用 Graphviz DOT 格式来检查我对数据结构链接的印象是否与现实相符。我发现它是一个非常有用的工具,并不断向任何使用复杂数据结构的人推荐它。

    【讨论】:

    • 我希望你对我的编辑没意见。 OP 说他们正在使用 igraph,我添加了有关如何从 igraph 导出为 Graphviz 格式的信息。
    【解决方案2】:

    要绘制有向图,请尝试使用 GraphViz (https://www.graphviz.org)。

    如果您愿意以符合其支持格式之一 (https://gephi.org/users/supported-graph-formats/) 的方式将数据写入文件,您也可以使用 Gephi (https://gephi.org) 之类的工具。 GML 看起来很简单。

    【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多