12

我知道它R会自动加载一些调色板,例如palette、和. 我也知道。但是,如果我想使用自定义调色板并按名称分配颜色怎么办?那可能吗? rainbowheat.colorsgrayRColorBrewer

我公司的调色板如下:

#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 启动时自动加载的元素,这将允许我将自定义颜色名称调用到绘图中吗?

4

3 回答 3

14

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

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')。

您还可以命名“调色板矢量”

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 列表有很好的对应关系。所以它已经是 R 的一部分。假设你想找到“LavenderBlush”的 R 颜色名称。分配颜色名称的向量是从 colors() 返回的,但它相当大,因此您可以使用以下方法对其进行缩减:

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

假设您想查看该颜色的十六进制代码是否与您无法读取的 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"
于 2012-08-11T02:58:58.197 回答
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"
于 2012-08-11T21:34:00.690 回答
-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")
于 2015-08-13T17:45:34.750 回答