Dipto Dipto - 1 month ago 8
R Question

Generate colors based on unique entries in another list in R

I want to use a color palette to define colors for my graph edges in igraph. I have create the color palette using

RColorBrewer
and need to assign a unique color to each edge based on edge attribute information.

Here is my attempt so far:

colrs<- brewer.pal(length(unique(E(g)$fruit)), "Accent")
E(g)$color <- colrs[E(g)$fruit] #Does not work
E(g)$color
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[40] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[79] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA


Is there a way I can use the
E(g)$fruit
as an index into the
colrs
list?

There are 4 types of fruits in
E(g)$fruit
:

unique(E(g)$fruit)
"Apple" "Orange" "Grapes" "Pear"


Thus depending on what type of fruit each edge has, it should get the corresponding color from the
colrs
list such that all edges with "Apple" have the same color, all edges with "Orange" has the same color and so on and so forth. I will eventually plot the graph with the following code:

plot(g,layout=layout.fruchterman.reingold, vertex.color='grey80', vertex.label.color="black", edge.color=E(g)$color)


Here is a sample of the edgelist of my graph:

from to fruit
1 A B Apple
2 A C Apple
3 B C Grapes
4 D B Pear
5 D C Orange

Answer

Name your colrs vector by the unique E(g)$fruit:

df <- read.table(header=T, text="
  from   to    fruit
1 A      B     Apple
2 A      C     Apple
3 B      C     Grapes
4 D      B     Pear
5 D      C     Orange")
library(igraph)
library(RColorBrewer)
g <- graph_from_data_frame(df)
colrs<- brewer.pal(length(unique(E(g)$fruit)), "Accent")  
names(colrs) <- unique(E(g)$fruit)
E(g)$color <- colrs[E(g)$fruit]  #Does not work
E(g)$color
# [1] "#7FC97F" "#7FC97F" "#BEAED4" "#FDC086" "#FFFF99"
plot(g,layout=layout.fruchterman.reingold, vertex.color='grey80', vertex.label.color="black", edge.color=E(g)$color)