我开始在C学习igraph,我想知道如何可视化用这个库制作的图形。我已经看到使用igraph R只是使用绘图功能并绘制图形但是如果我使用C,我应该在文件中打印图形然后使用另一个程序来可视化它或者通常的方式是什么?
谢谢!
编辑:This种图。
答案 0 :(得分:3)
按照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文章中显示的图表,
DOT语言被指定为here,但它确实非常简单。 --
表示无向边,->
表示有向边。 rankdir=LR;
行是图形属性,告诉DOT它应该尝试从左到右排序节点。默认值是从上到下。您也可以添加节点属性,例如"6" [ label="Six" ];
会将节点"6"
的标签更改为Six
。边缘属性的工作方式完全相同;所以使用"2" -- "1" [ taillabel="Z" ];
添加" Z"靠近节点" 2"节点之间的边缘结束" 2"和" 1"。最好引用节点名称,即使节点名称以字母开头且与图形属性名称不匹配,也不需要引号。
打印树木或链接列表时,这是一个有用的提示:
使用%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=
的fprintf)。
如果您将图形打印到标准输出,您可以将输出重定向到文件并使用dot -Tformat filename
显示或转换它,或者您可以将输出直接传送到| dot -Tx11
以查看生成的曲线图。
我经常使用Graphviz DOT格式来检查我的数据结构链接的心理图像是否与现实相符。我发现它是一个非常有用的工具,并且继续为使用复杂数据结构的人推荐它。
答案 1 :(得分:1)
要绘制有向图,请尝试GraphViz(https://www.graphviz.org)。
如果您愿意以符合其支持格式之一(https://gephi.org)的方式将数据写入文件,则可以使用Gephi(https://gephi.org/users/supported-graph-formats/)之类的工具。 GML看起来很直接。