2012-08-11 67 views
9

我知道R自動加載了一些調色板,如palette,rainbow,heat.colorsgray。我也知道RColorBrewer。但是,如果我想使用自定義調色板並按名稱分配顏色,該怎麼辦?那可能嗎?在R中創建自定義調色板

我公司的調色板如下:

#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啓動時自動加載的元素,它允許我將一個自定義顏色名稱調入一個圖中?

回答

11

這個答案(或至少是一個可能的答案),您的意見和編輯:

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允許您設置的α水平,從而使支持它的圖形設備透明度(至少:'pdf','窗口','石英'和'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顏色名稱。分配的顏色名稱的載體是從顏色()返回,但它是相當大的,所以你可以消減下來有:

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" 

沒錯。而對於你的例子只是用「海藻綠」:

> 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" 
+0

我更新的問題是有點更清晰。我只是用這個gif作爲例子。理想情況下,我會拿我公司的顏色和調色板,所以它會是10色左右,而不是200或任何它。我嘗試了你的建議,然後再次製作了劇情。 'plot(x,y,col =「ccodes」)',它返回這個值:'plot.xy(xy,type,...)中的錯誤:無效的顏色名稱'ccodes''。這可以工作:'plot(x,y,col =「#2e8b57」)'。在那個例子中沒有辦法讓ccodes工作嗎?謝謝 – mikebmassey 2012-08-11 03:27:53

+0

就像情節(x,y,col =「seagreen」)一樣。 – 2012-08-11 05:06:11

+0

'paste0(「#」,ccodes) - > ccodes'然後你可以在你的劇情調用中使用它,只要你放下引號:'plot(x,y,col = ccodes)' – plannapus 2012-08-11 08:22:20

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" 
+1

你不能只使用一個命名的矢量?那麼你可以跳過一些'unlist'語句,並使用'ATcolor < - function(x)AT_color_data [x]'(我認爲) – 2012-08-11 23:29:40

+0

好點。我會編輯。 – seancarmody 2012-08-11 23:57:35

0
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")