Search code examples
rigraphbipartite

How to construct bipartite graphs using igraph?


I need to create a bipartite graph for consumer-brand relationships.

This is my example data:

datf <- data.frame(Consumers = c("A", "B", "C", "D", "E"),
                   Brands = c("Costa", "Starbucks", "Cafe2U", "Costa", "Costa"))

The following code gives me a network. But I am not sure how I can add a node type attribute to label consumers and brands:

    library(igraph) 
    dat=read.csv(file.choose(),header=TRUE) 
    el=as.matrix(dat) 
    el[,1]=as.character(el[,1])
    el[,2]=as.character(el[,2])
    g=graph.edgelist(el,directed=FALSE) 

I would like to create a bipartite graph with edges that connect each consumer with the brand they like. Ideally, the nodes will be labeled with text.

Could you show me how to do this using library(igraph)?


Solution

  • This resource at Shizuka Lab is really useful for exploring bipartite networks in R with igraph. In short:

    library(igraph)
    
    # Your matrix containing consumer choice by brands
    m = matrix(data = sample(0:1, 25, replace = TRUE), nrow = 5, ncol = 5)
    colnames(m) = c("A", "B", "C", "D", "E")
    rownames(m) = c("Costa", "Starbucks", "Cafe2U", "Petes", "Philz")
    
    # Convert it to a bipartitie network
    bg = igraph::graph.incidence(m)
    bg
    
    # See the vertex attributes 
    V(bg)$type 
    V(bg)$name
    
    # Plot the network
    shape = ifelse(V(bg)$type, "circle", "square") # assign shape by node type
    col = ifelse(V(bg)$type, "red", "yellow") # assign color by node type
    
    plot(bg, vertex.shape = shape, vertex.color = col)
    

    Gives: