igraph-help
[Top][All Lists]
Advanced

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

Re: [igraph] Different plotting of graphs in R and in Python


From: Charles Novaes de Santana
Subject: Re: [igraph] Different plotting of graphs in R and in Python
Date: Tue, 22 Sep 2015 14:50:14 +0200

Hi Tamas,

Thank you very much for your reply and your suggestion. Beyond the vertex label, the only other attribute we will use is the edge weight.

I will try to implement the solution you gave us for vertex label. If it works fine for what we need, we can try to add the edge weight later.

A last question: I suppose the same limitation is observed for igraph.Graph.difference, right?

Do you think I could open an issue in igraph github asking for this change in the implementation of union (and difference) in Python?

Best,

Charles

On 22 September 2015 at 11:24, Tamas Nepusz <address@hidden> wrote:
Hi Charles,

Unfortunately, graph union works differently in the R interface and in
the Python interface.

The native C core of igraph supports graph union only by IDs and not
by vertex names. The R interface contains an implementation of "graph
union by vertex names", and it is selected automatically if your graph
has vertex names. There is no equivalent function in the Python
interface as I did not have time to implement something similar yet.
If you have no other vertex or edge attributes to preserve, you could
probably roll your own as follows:

def vertex_name_index(graph):
    return dict((v, k) for k, v in enumerate(graph.vs["name"]))

def graph_union_by_name(g1, g2):
    result_names = sorted(set(g1.vs["name"]) + set(g2.vs["name"]))
    result = Graph(len(result_names))
    result.vs["name"] = names
    result_name_index = vertex_name_index(graph)
    edges = []
    for edge in g1:
        src = "">         dest = result_name_index[g1.vs[edge.target]["name"]]
        edges.append((src, dest))
    for edge in g2:
        src = "">         dest = result_name_index[g2.vs[edge.target]["name"]]
        edges.append((src, dest))
    result.add_edges(edges)
    return result

The code above is totally untested but I think that it should work
with minor modifications at worst.

All the best,
T.
T.


On Mon, Sep 21, 2015 at 11:33 PM, Charles Novaes de Santana
<address@hidden> wrote:
> Just found that the function graph.union does the "sum" I want to do. But,
> again, I only can run this function correctly in R, not in Python.
>
> Given the code in R:
>
> library(igraph)
> nodes1 = c("a","b","c")
> nodes2 = c("c","d","e")
> edges1 = matrix( c("a", "b", "b", "c","c","a"), nc = 2, byrow = TRUE)
> edges2 = matrix( c("c", "d", "d", "e","e","c"), nc = 2, byrow = TRUE)
> g1 = graph(edges1,directed=FALSE)
> g2 = graph(edges2,directed=FALSE)
>
> g3 = graph.union(g1,g2);
> plot(g3);
>
> Now the equivalent code in Python:
>
> import igraph
> nodes1 = ["a","b","c"]
> nodes2 = ["c","d","e"]
> edges1 = [["a","b"],["b","c"],["c","a"]]
> edges2 = [["c","d"],["d","e"],["e","c"]]
> g1 = igraph.Graph(directed=False)
> g2 = igraph.Graph(directed=False)
> g1.add_vertices(nodes1)
> g2.add_vertices(nodes2)
> g1.add_edges(edges1)
> g2.add_edges(edges2)
>
> g3 = igraph.Graph.union(g1,g2)
> plot(g3)
>
> As you can see, the behaviour of the plot in Python is still different from
> the one in R. Actually, it is worst than the one I had before, because now I
> only can see 3 vertices. What am I missing here?
>
> Thanks again for any tip,
>
> Best,
>
> Charles
>
> On 21 September 2015 at 23:16, Charles Novaes de Santana
> <address@hidden> wrote:
>>
>> Dear all,
>>
>> I am trying to plot a "sum of graphs" in R and in Python, using Igraph. I
>> can do it correctly in R, but I am facing some problems to reproduce it in
>> Python. I was wondering if you could help me with this.
>>
>> Please consider the following toy code in R:
>>
>> library(igraph)
>> nodes1 = c("a","b","c")
>> nodes2 = c("c","d","e")
>> edges1 = matrix( c("a", "b", "b", "c","c","a"), nc = 2, byrow = TRUE)
>> edges2 = matrix( c("c", "d", "d", "e","e","c"), nc = 2, byrow = TRUE)
>> g1 = graph(edges1,directed=FALSE)
>> g2 = graph(edges2,directed=FALSE)
>>
>> plot(g1+g2);
>>
>> you can see that in the plot(g1+g2) the vertex "c" is shared by both
>> graphs. So actually I can plot one connected graph with the vertices
>> "a","b","c","d","e".
>>
>> I would like to reproduce it in Python. The best way I think now is the
>> following code, but it is failing:
>>
>> import igraph
>> nodes1 = ["a","b","c"]
>> nodes2 = ["c","d","e"]
>> edges1 = [["a","b"],["b","c"],["c","a"]]
>> edges2 = [["c","d"],["d","e"],["e","c"]]
>> g1 = igraph.Graph(directed=False)
>> g2 = igraph.Graph(directed=False)
>> g1.add_vertices(nodes1)
>> g2.add_vertices(nodes2)
>> g1.add_edges(edges1)
>> g2.add_edges(edges2)
>>
>> igraph.plot(g1+g2);
>>
>> you can see that the igraph.plot(g1+g2) does not consider that vertex "c"
>> is shared by g1 and g2. Do you have any idea why these codes have different
>> behaviour? I know I am building the graphs in different ways, but I was not
>> able to build the graph in Python in the same way I do it in R.
>>
>> Sorry if it is a silly question (I used to program in R during some years,
>> but I am just a beginner in Python). Thanks for any help or advice!
>>
>> Best,
>>
>> Charles
>>
>> --
>> Um axé! :)
>>
>> --
>> Charles Novaes de Santana, PhD
>> http://www.imedea.uib-csic.es/~charles
>
>
>
>
> --
> Um axé! :)
>
> --
> Charles Novaes de Santana, PhD
> http://www.imedea.uib-csic.es/~charles
>
> _______________________________________________
> igraph-help mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/igraph-help
>

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



--
Um axé! :)

--
Charles Novaes de Santana, PhD
http://www.imedea.uib-csic.es/~charles

reply via email to

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