2013-02-21 49 views
6

在R中,我可以輕鬆生成一個顏色漸變,例如colorRampPalette。以下產生從藍色到紅色的五種顏色的序列:如何在R中生成從數字到顏色的映射?

> mypal <- colorRampPalette(c("blue", "red"))(5) 
> mypal 
[1] "#0000FF" "#3F00BF" "#7F007F" "#BF003F" "#FF0000" 

如何在此調色板上輕鬆映射數字矢量?我說,我有一個數字0到10之間的載體,就像這樣:

x <- c(1, 9, 8.5, 3, 3.4, 6.2) 

我想一個函數,說map2color,這樣當我運行map2color(mypal, x),我得到

#0000FF, #FF0000, #FF0000, #3F00BF, #3F00BF, #BF003F 

我通常這樣做以下

mypalette[ findInterval(x, seq(0, 10, length.out= 6), rightmost.closed= T) ] 

但也許有更好的解決方案OOB自動生成彩色刻度數字矢量。

+0

你可能有更多的運氣在HCL色彩空間和不同的亮度,看到'?hcl' – James 2013-02-21 16:40:09

回答

4

我colourscheme包確實是:

https://r-forge.r-project.org/projects/colourscheme/

其主要目的是創建一個映射數值(不僅僅是整數顏色編號功能)到顏色。一旦你安裝了它,小插曲就是最好的文檔。

+0

聽起來很有趣的情況下!請問爲什麼你沒有提交給CRAN? (我不能install.packages安裝,必須使用SVN) – January 2013-02-21 19:36:16

+0

這是一個相當快的特設黑客,文檔是有點廢話,而且我希望它會收集一些勢頭和使用 - 但它從不做... – Spacedman 2013-02-22 13:40:47

+0

是的,但我一個人會,並沒有找到它,因爲它不是在CRAN :-) – January 2013-02-22 15:15:53

4

您可以嘗試在R-Forge的

> colorRampPalette(c('blue', 'red'))(length(x))[rank(x)] 
[1] "#0000FF" "#FF0000" "#CC0032" "#3300CC" "#660099" "#990065" 
+0

但這是從OP結果不同,是不是? – agstudy 2013-02-21 16:12:47

+2

不,這是行不通的,密切的數字應該有非常相似的顏色。以c(1,2,3,200);前三個數字都應該接近顏色階梯的開始,並且使用階層3將已經是藍色。 – January 2013-02-21 18:02:15

+0

這可能不是解決一月的問題,但它解決不同的問題,要區分所有號碼的1,2,3和200的情況下 – 2018-02-14 06:09:43

3

這裏是一個map2color功能:

map2color<-function(x,pal,limits=NULL){ 
    if(is.null(limits)) limits=range(x) 
    pal[findInterval(x,seq(limits[1],limits[2],length.out=length(pal)+1), all.inside=TRUE)] 
} 


map2color(0:11,rainbow(200),limits=c(1,10)) 
[1] "#FF0000FF" "#FF0000FF" "#FFA800FF" "#ADFF00FF" "#05FF00FF" "#00FFA3FF" 
[7] "#00ABFFFF" "#0003FFFF" "#A600FFFF" "#FF00B0FF" "#FF0008FF" "#FF0008FF" 
map2color(0:11,rainbow(200)) 
[1] "#FF0000FF" "#FF8A00FF" "#EBFF00FF" "#61FF00FF" "#00FF29FF" "#00FFB3FF" 
[7] "#00BAFFFF" "#0030FFFF" "#5900FFFF" "#E300FFFF" "#FF0091FF" "#FF0008FF" 


mypal <- colorRampPalette(c("blue", "red"))(5) 
x <- c(1, 9, 8.5, 3, 3.4, 6.2) 
map2color(x,mypal) 
"#0000FF" "#FF0000" "#FF0000" "#3F00BF" "#3F00BF" "#BF003F" 

我需要像這樣創建一個colorramp這將是跨越不同的數據樣本一致,所以我加了一個XLIM參數。感謝您提問中的findInterval函數。

2

我能想到的是你的離散變量x與cut,然後使用得到的係數索引像heat.colorscm.colors

f <- function(x,n=10){ 
    heat.colors(n)[cut(x,n)] 
} 

一個調色板最簡單的做法看?heat.colors的調色板的更多細節。

這個函數將給你對應於x的顏色向量,其變化的粒度與n成比例。