igraph-help
[Top][All Lists]
Advanced

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

Re: [igraph] Horizontal gap (hgap) not taken into account when creating


From: Antonin Lenfant
Subject: Re: [igraph] Horizontal gap (hgap) not taken into account when creating a Sugiyama layout with the Python binding
Date: Fri, 29 Mar 2013 10:28:45 -0700

Hello,

Thanks for the answer!

I had no success using the layout's bounding box as the value for my plot's bbox parameter, because I could only see a few nodes on the left edge of my rendered pdf or svg. I think this might be because my layout's bounding box has a negative first element? It was BoundingBox(-926.5, 1.0, 13.0, 5097.0).

I set the bbox manually and used a huge width of 40000 and the nodes weren't on top of each other any more.

However, when plotting I see some strange artifacts that were not visible when exporting to dot format and using Graphviz's dot renderer (which is similar to Sugiyama) : I wouldn't really know how to explain it so here is a screenshot :
http://i.imgur.com/hhZz5v7.png

Those artifacts are also visible when using a smaller bbox width and the nodes are on top of each other. I tried using a bigger number of iterations (10k now) but it doesn't seems to have an effect.

Thank you, and have a good day!

On Fri, Mar 29, 2013 at 3:07 AM, Tamás Nepusz <address@hidden> wrote:
Hello,

> However, it seems that it doesn't take into account the hgap property, which should set the "minimum horizontal gap between vertices in the same layer", according to the documentation.
It does take the hgap property into account, the problem is that igraph.plot() will rescale your layout to fill the specified bounding box and it does not strive to keep the aspect ratio the same. To prove that layout_sugiyama() indeed uses the hgap parameter, try this:

>>> g = Graph.Tree(4, 3)
>>> layout_1 = g.layout_sugiyama(hgap=1)
>>> print list(layout_1)
[[1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [2.0, 1.0]]
>>> layout_2 = g.layout_sugiyama(hgap=10)
>>> print list(layout_2)
[[10.0, 0.0], [0.0, 1.0], [10.0, 1.0], [20.0, 1.0]]

The only solution I can think of is to take the layout, get its bounding box using the bounding_box() method of the layout itself and then specify the bbox parameter of igraph.plot to be proportional to the dimensions of the layout's bounding box (and don't forget to set margin=0 or take the margin into account when invoking igraph.plot()). Yes, I agree that this sucks. I will add a keep_aspect_ratio option to the default graph drawer class in the next version.

If you are willing to modify igraph's source code a bit, you can also work around the issue as follows:

1. Open igraph/drawing/graph.py from igraph's source code -- this contains the DefaultGraphDrawer class, which is used for graph drawing.

2. Find the line that looks like this:

layout.fit_into(bbox, keep_aspect_ratio=False)

3. Replace the line with the following:

layout.fit_into(bbox, keep_aspect_ratio=kwds.get("keep_aspect_ratio", False))

Then you can simply say igraph.plot(g, "graph.pdf", layout=layout, keep_aspect_ratio=True).

> It also seems that the weights property ("edge weights to be used") wasn't taken into account when I tried it, passing a list with the weight for each layer.
The weights are taken into account only in the cycle-breaking phase: since the Sugiyama layout requires a directed acyclic graph, it will temporarily break all the cycles by trying to remove a set of edges whose total weight is minimal.

--
T.
_______________________________________________
igraph-help mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/igraph-help


reply via email to

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