在R中创建自定义调色板

时间:2012-08-11 02:34:42

标签: r colors

我知道R会自动加载一些调色板,例如paletterainbowheat.colorsgray。我也知道RColorBrewer。但是,如果我想使用自定义调色板并按名称指定颜色,该怎么办?那可能吗?

我公司的调色板如下:

#1A73BA (R: 26 G: 115 B: 186) - this is a blue
#FFDB43 (R:255 G:219 B:67) - this is a yellow
#B54B05 (R:181 G:75 B:5) - this is an orange

我公司的名字缩写是AT。

我希望能够通过名称而不是HEX或RGB来调用这些颜色,因为我不记得它们。理想情况下,我可以创建一个自动加载到R中的文件来启动这些颜色。

ATBlue <- #1A73BA
ATYellow <- #FFDB43
ATOrange <- #B54B05

然后,我可以调用颜色:

plot(x,y, col = "ATBlue")

我可以将值放入数据框中,然后像这样调用它们:

ATColors <- data.frame(name = c("ATBlue", "ATYellow", "ATOrange"), color= c("#1A73BA", "#F7D364", "#B54B05"))

plot(x,y, col = ATColors[3,2])

但我需要知道数据框中的位置才能正确调用它。

我可以创建一个元素,当R启动时会自动加载,这样我就可以将自定义颜色名称调用到图中吗?

3 个答案:

答案 0 :(得分:13)

这回答(或至少是一个可能的答案)你的评论和编辑:

ATblue <- rgb(26/255, 115/255, 186/255, 1)
 ATyellow <- rgb(255/255, 219/255, 67/255, 1)
 ATorange <- rgb(181/255, 75/255, 5/255, 1)

 plot(1:10, col= c(ATblue, ATyellow, ATorange), pch=20)

使用rgb的定义方法允许您设置alpha级别,从而允许支持它的图形设备的透明度(至少:'pdf','windows','quartz'和'X11')。

您还可以命名'palette-vector'

palvec <-  c(ATblue=ATblue, ATyellow=ATyellow, ATorange=ATorange)

可以使用数字或名称访问该向量:

plot(1,1) # to set up plot window
abline(h=c(0.8,1,1.2), col= palvec[ c( 'ATblue', 'ATyellow', 'ATorange' ) ] , lwd=40)

总的来说,我认为你会发现,如果你使用全部小写,那么基本和图形包(默认加载,因此不需要重命名)与gif-list会有很好的对应关系。所以它已经是R的一部分了。假设您想要找到“LavenderBlush”的R颜色名称。分配的颜色名称的向量是从colors()返回的,但它相当大,所以你可以用它来减少它:

grep("lavender", colors(), ignore.case=TRUE, value=TRUE)
#[1] "lavender"       "lavenderblush"  "lavenderblush1" "lavenderblush2" 
#     "lavenderblush3" "lavenderblush4"

并且说你想看看那个颜色的Hex代码是否与你不可读的gif表上的代码相同:

 ccodes <- as.hexmode( c(256^(2:0) %*% col2rgb("lavenderblush")) )
 ccodes
 #[1] "fff0f5"

是的。而对于你的例子,只需使用“seagreen”:

> ccodes <- as.hexmode( c(256^(2:0) %*% col2rgb("seagreen")) )
> ccodes
[1] "2e8b57

如果您有十六进制代码值,则可以使用paste0向其附加“#”:

 paste0("#", ccodes)
#[1] "#2e8b57"
 plot(1,1, col=paste0("#", ccodes) )

如果您有这样的值矢量,paste0也会被矢量化:

 ccodes <- as.hexmode( c(256^(2:0) %*% col2rgb(colors()[20:25])) )
 paste0("#", ccodes)
#[1] "#ffe4c4" "#eed5b7" "#cdb79e" "#8b7d6b" "#000000" "#ffebcd"

答案 1 :(得分:2)

我会将颜色放在这样的命名向量中:

ATcols <- c(blue = "#1A73BA", yellow = "#FFDB43", orange = "#B54B05")

然后你就可以得到这样的蓝色:ATcols["blue"]

如果你想成为一个有点发烧友,你可以创建一个命名向量和一个函数:

AT_color_data <- c(blue = "#1A73BA", yellow = "#FFDB43", orange = "#B54B05")
ATcolor <- function(color="blue") {
         if (is.numeric(color)) AT_color_data[color]
         else AT_color_data[tolower(color)]
}

这为您提供了一些获取颜色的选项:

ATcolor(2:3)
#    yellow    orange 
# "#FFDB43" "#B54B05"

ATcolor("orange")
#    orange 
# "#B54B05" 

ATcolor(c("orange", "blue"))
#    orange      blue 
# "#B54B05" "#1A73BA" 

或者,在提供数字参数时,可以使函数的行为更像rainbow

AT_color_data <- c(blue = "#1A73BA", yellow = "#FFDB43", orange = "#B54B05")
ATcolor <- function(color="blue") {
         if (is.numeric(color)) AT_color_data[1:color[1]]
         else AT_color_data[tolower(color)]
}

然后,例如:

ATcolor(2)
#      blue    yellow 
# "#1A73BA" "#FFDB43"

答案 2 :(得分:-2)

library("grDevices")
plot(1:20,pch=20,col=col)
col=colorRampPalette(c("white", "red"))(20) 
M <- matrix(runif(100),10,10)
M[lower.tri(M)] <- NA
image(M,col = col,frame=F,xaxt="n",yaxt="n")