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

Generate colors based on unique entries in another list in R

我想使用调色板为 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

用唯一的 E(g)$fruit 命名你的 colrs 向量:

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)

我需要类似的代码,但我需要更大的颜色托盘("Accent" 中提供的颜色多于 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)