igraph-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[igraph] Re: Problem with layouts with GraphML


From: Dr Karl
Subject: [igraph] Re: Problem with layouts with GraphML
Date: Fri, 20 Nov 2009 00:51:23 -0800 (PST)
User-agent: G2/1.0

Hi Tamas,

     Thank you for your quick answer!!

     Well, I have done what you said in your message, and now
my .graphml file has two attributes. This is my code, in case someone
needs to add attributes as well:

        igraph_t g;
        igraph_matrix_t res;
        igraph_vector_t edges;
        igraph_vector_t col1;
        igraph_vector_t col2;
        igraph_i_set_attribute_table(&igraph_cattribute_table);
        igraph_vector_init(&edges, 4*relations.size());
        igraph_matrix_init(&res, 0, 0);
        int i = 0;
        for (vector<Relationship>::iterator it = relations.begin(); it!
=relations.end(); ++it) {
                rel = (Relationship)*it;
                if (rel.AtoB>=1 && rel.BtoA>=1 && 
(rel.AtoB+rel.BtoA)>=minLevels) {
                        if (rel.AtoB>0 || rel.BtoA>0) {
                                VECTOR(edges)[i] = rel.nodeA;
                                i++;
                                VECTOR(edges)[i] = rel.nodeB;
                                i++;
                        }
                }
        }
        igraph_vector_resize(&edges, i);
        igraph_create(&g, &edges, 0, IGRAPH_DIRECTED);
        igraph_layout_random(&g, &res);
        long size = igraph_matrix_nrow(&res);
        igraph_vector_init(&col1, size);
        igraph_vector_init(&col2, size);
        igraph_matrix_get_col(&res, &col1, 0);
        igraph_matrix_get_col(&res, &col2, 1);
        igraph_cattribute_VAN_setv(&g, "X", &col1);
        igraph_cattribute_VAN_setv(&g, "Y", &col2);
        FILE* graphml_file;
        graphml_file = fopen("test_graph_layouts_random.graphml","w");
        igraph_write_graph_graphml(&g, graphml_file);
        igraph_vector_destroy(&edges);
        igraph_vector_destroy(&col1);
        igraph_vector_destroy(&col2);
        igraph_destroy(&g);
        igraph_matrix_destroy(&res);

Ok, now on every node I have two attributes, like this

   <node id="n0">
      <data key="X">-0.378323</data>
      <data key="Y">0.89578</data>
    </node>

but on yEd generated graphs, the layout is set like this

   <node id="n0">
      <data key="d0"/>
      <data key="d1">
        <y:ShapeNode>
          <y:Geometry height="30.0" width="30.0" x="25.0" y="0.0"/>
          <y:Fill color="#CCCCFF" transparent="false"/>
          <y:BorderStyle color="#000000" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content"
fontFamily="Dialog" fontSize="12" fontStyle="plain"
hasBackgroundColor="false" hasLineColor="false" height="4.0"
modelName="internal" modelPosition="c" textColor="#000000"
visible="true" width="4.0" x="13.0" y="13.0"/>
          <y:Shape type="rectangle"/>
        </y:ShapeNode>
      </data>
    </node>

and before the <graph ...> tag

  <key attr.name="description" attr.type="string" for="node" id="d0"/>
  <key for="node" id="d1" yfiles.type="nodegraphics"/>
  <key attr.name="description" attr.type="string" for="edge" id="d2"/>
  <key for="edge" id="d3" yfiles.type="edgegraphics"/>
  <key for="graphml" id="d4" yfiles.type="resources"/>

I only use yEd for quick viewing of the graph, but I assume that if a
graph doesn't display correctly on yEd, it won't display correctly on
my Flex web application based on yFiles either.

So, is there a way I can attach something like <y:Geometry
height="30.0" width="30.0" x="25.0" y="0.0"/> inside the <data
key="d1"> attribute?? this is like nested attributes, whick I don't
know if are supported by iGraph.

Thank you very much.

On 19 nov, 18:57, Tamas Nepusz <address@hidden> wrote:
> Hi Karl,
>
> > My problem is that if I open the resulting .graphml files with
> > yEd (by yWorks), all the vertices are centered and it is impossible to
> > see the graph.
>
> This is  because no layout information is saved in the GraphML file when
> you export a graph from igraph. If you want to calculate a layout in
> igraph and then store it in the GraphML file, you will need two things:
>
> 1. Attach the (experimental) C attribute handler to igraph; these set
>    of functions are responsible for storing attributes properly in the
>    C layer. (The R and the Python interfaces use different attribute
>    handlers, that's why you have to attach the attribute handler
>    manually). See:http://igraph.sourceforge.net/doc/html/ch09s02.html
>
> 2. Calculate a layout using some of the layout functions in igraph
>    and save the layout in an igraph_matrix_t.
>
> 3. Extract the first and the second column of the matrix to two
>    igraph_vector_t variables.
>
> 4. Copy the calculated coordinates from the vectors to two node
>    attributes (say, X and Y) using igraph_cattribute_VAN_setv or its
>    associated macro version called SETVANV.
>
> 5. Save your graph into GraphML as you did before.
>
> If you do this, the saved GraphML file will contain the calculated
> layout information using the two node attributes. However, I don't know
> whether yEd can be "convinced" to use these attributes for setting up
> the layout in the graph view. When you save a graph from yEd into
> GraphML format, yEd uses its own XML schema extensions to store the
> layout and other visual properties of nodes and edges, and you cannot
> reproduce that from igraph.
>
> --
> Tamas
>
> _______________________________________________
> igraph-help mailing list
> address@hidden://lists.nongnu.org/mailman/listinfo/igraph-help




reply via email to

[Prev in Thread] Current Thread [Next in Thread]