igraph-help
[Top][All Lists]
Advanced

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

Re: [igraph] Re: Problem with layouts with GraphML


From: Gábor Csárdi
Subject: Re: [igraph] Re: Problem with layouts with GraphML
Date: Fri, 20 Nov 2009 10:12:48 +0100

Hi Karl,

the problem is, that the yFiles GraphML extensions are not supported
by igraph. (Actually I don't really know why they needed to extend
GraphML to store the coordinates.) There is currently no way to export
such a file from igraph, and most probably this will not change in the
near future.

Best,
Gabor

On Fri, Nov 20, 2009 at 9:51 AM, Dr Karl <address@hidden> wrote:
> 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
>
>
> _______________________________________________
> igraph-help mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/igraph-help
>



-- 
Gabor Csardi <address@hidden>     UNIL DGM




reply via email to

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