2012-04-25 103 views
0

考虑到How to keep position of nodes in igraph + R,我有一个四个顶点id(0,1,2,3),名称(1,2,3,4)和位置(0,0,0,1,1,1,1,0),举个简单的例子,我想消除顶点id(1), 并保留其他的位置和名称。下一个代码将演示一个绘图实现来调试它。我必须做几个消除,同时保持其他顶点的位置和名称,如何在C中做到这一点?基于第9章图形如何保留Igraph中节点的位置和名称C

#include <igraph.h> 
#include <fstream> 
#include <iostream> 
#include <stdlib.h> 

#include <vector> 
#include <algorithm> 
#include <map> 
#include <set> 

using namespace std; 


void plot(igraph_t g) { 
     FILE *ofile; 
     ofile=fopen("test.txt", "w+"); 
     igraph_write_graph_edgelist(&g,ofile); 
     fclose (ofile); 

     ofstream gp("data.R"); 
     gp << "library(igraph)"<<endl; 
     gp << "library(Cairo)"<<endl; 
     gp << "g1 <-read.table(\"test.txt\")"<< endl; 
     gp << "g1 <- t(as.matrix(g1))"<< endl; 
     gp << "g<-graph(g1,n=4,dir=FALSE)"<< endl; 
     gp << "V(g)$name<-c(1:4)"<< endl; 
     gp << "V(g)$label<-V(g)$name"<< endl; 
     gp << "V(g)$id<-c(0:3)"<< endl; 
     gp << "coords <- c(0,0,0,1,1,1,1,0)"<< endl; 
     gp << "coords <- matrix(coords, 4,2,byrow=T)"<< endl; 
     gp << "plot(g,layout=coords[V(g)$name,])"<< endl; 
     gp.close(); 

     system("R CMD BATCH data.R"); 
} 


int main() { 


     igraph_t g; 
     igraph_vector_t v; 


     igraph_vector_init(&v,8); 
     VECTOR(v)[0]=0; VECTOR(v)[1]=1; 
     VECTOR(v)[2]=1; VECTOR(v)[3]=2; 
     VECTOR(v)[4]=2; VECTOR(v)[5]=3; 
     VECTOR(v)[6]=3; VECTOR(v)[7]=0; 

     igraph_create(&g, &v, 0,0); 

     //plot(g); 

     igraph_delete_vertices(&g,igraph_vss_1(1)); 

     plot(g); 


     igraph_destroy(&g); 
     igraph_vector_destroy(&v); 

     return 0; 
} 

编辑程序,顶点和边属性(陶):

我编辑的程序,现在我把名字,但如何在这些顶点名称的功能获得边缘和然后写在igraph_write_graph_edgelist(& g,ofile)?

#include <igraph.h> 
#include <fstream> 
#include <iostream> 
#include <stdlib.h> 

#include <vector> 
#include <algorithm> 
#include <map> 
#include <set> 

#include <string.h> 
#include <stdlib.h> 

using namespace std; 

void plot(igraph_t g) { 
     FILE *ofile; 
     ofile=fopen("test.txt", "w+"); 
     igraph_write_graph_edgelist(&g,ofile); 
     fclose (ofile); 

     ofstream gp("data.R"); 
     gp << "library(igraph)"<<endl; 
     gp << "library(Cairo)"<<endl; 
     gp << "g1 <-read.table(\"test.txt\")"<< endl; 
     gp << "g1 <- t(as.matrix(g1))"<< endl; 
     gp << "g<-graph(g1,n=4,dir=FALSE)"<< endl; 
     gp << "V(g)$name<-c(1:4)"<< endl; 
     gp << "V(g)$label<-V(g)$name"<< endl; 
     gp << "V(g)$id<-c(0:3)"<< endl; 
     gp << "coords <- c(0,0,0,1,1,1,1,0)"<< endl; 
     gp << "coords <- matrix(coords, 4,2,byrow=T)"<< endl; 
     gp << "plot(g,layout=coords[V(g)$name,])"<< endl; 
     gp.close(); 

     system("R CMD BATCH data.R"); 
} 


int main() { 
     igraph_i_set_attribute_table(&igraph_cattribute_table); 

     igraph_t g; 
     igraph_vector_t v; 


     igraph_strvector_t vnames1,vnames2; 





     igraph_vector_init(&v,8); 
     VECTOR(v)[0]=0; VECTOR(v)[1]=1; 
     VECTOR(v)[2]=1; VECTOR(v)[3]=2; 
     VECTOR(v)[4]=2; VECTOR(v)[5]=3; 
     VECTOR(v)[6]=3; VECTOR(v)[7]=0; 

     igraph_create(&g, &v, 0,0); 


     igraph_strvector_init(&vnames1, 0); 
     igraph_strvector_init(&vnames2, 0); 


     SETVAS(&g, "name", 0, "1"); 
     SETVAS(&g, "name", 1, "2"); 
     SETVAS(&g, "name", 2, "3"); 
     SETVAS(&g, "name", 3, "4"); 



     //plot(g); 



     igraph_delete_vertices(&g,igraph_vss_1(1)); 
     plot(g); 

     VASV(&g,"name",&vnames2); 

     long int i; 
     for (i=0; i<igraph_strvector_size(&vnames2); i++) { 
      printf("%s ", STR(vnames2, i)); 
     } 

     igraph_destroy(&g); 
     igraph_vector_destroy(&v); 

     return 0; 
} 

在此先感谢

vacing

+0

你可以创建一个'struct'一起持有'Node'的所有信息,并从图中正确的。由于'struct'保存了所有的信息,所以其他的'Nodes'都不会受到影响。 – twain249 2012-04-25 19:51:55

+0

嗯twain249,谢谢你的回答,但我认为会有一些igraph函数让我这样做。 – user1310873 2012-04-26 11:38:58

回答

0

附上姓名和任何相关信息,使用顶点属性的节点;这些将在删除后保留。

参见文档的相关章节:Chapter 9. Graph, Vertex and Edge Attributes

+0

好的,我已经编辑了程序,如何在这些顶点名称的函数中获得边缘,然后将它们写入igraph_write_graph_edgelist(&g,ofile)? – user1310873 2012-04-26 10:52:29

+0

使用igraph_write_graph_ncol可让您指定要用于顶点名称的顶点属性。 – 2012-04-26 18:20:34

+0

谢谢你的工作!你觉得如果我像这样设置坐标图SETVAN(g,'x',0,1.0),SETVAN(g,'y',0,1.0)有什么方法吗?这个建议试图在C/C++中创建一个绘图函数,让我调试我的代码。有关它的任何建议? – user1310873 2012-04-27 08:56:41