根据R中另一个列表中的唯一条目生成颜色

时间:2016-10-31 19:37:30

标签: r colors igraph

我想使用调色板为 igraph 中的图形边缘定义颜色。我使用RColorBrewer创建了调色板,需要根据边缘属性信息为每条边分配一种独特的颜色。

到目前为止,这是我的尝试:

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

我可以使用E(g)$fruit作为colrs列表的索引吗?

E(g)$fruit中有4种水果:

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

因此,根据每个边缘的 fruit 的类型,它应该从colrs列表中获取相应的颜色,使得“Apple”的所有边具有相同的颜色,所有边缘“Orange”具有相同的颜色,依此类推。我最终将使用以下代码绘制图形:

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

以下是我的图表边缘列表的示例:

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

2 个答案:

答案 0 :(得分:2)

使用唯一的colrs

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)

答案 1 :(得分:0)

我需要类似的代码,但我需要一个更大的颜色托盘(在&#34; Accent&#34;中提供8个以上),我们可以使用colorRampPalette函数。这样我们就可以根据需要的颜色创建自己的调色板。

colourCount = length(unique(g$fruit))
getPalette = colorRampPalette(brewer.pal(9, "Set1"))
colrs<- getPalette(colourCount)
names(colrs) <- unique(E(g)$fruit)
E(g)$color <- colrs[E(g)$fruit]  
E(g)$color
plot(g,layout=layout.fruchterman.reingold, vertex.color='grey80', vertex.label.color="black", edge.color=E(g)$color)