2013-02-21 10 views
6

W R, mogę łatwo wygenerować rampę kolorów, na przykład colorRampPalette. Poniższa produkuje sekwencję pięciu kolorach, od niebieskiego do czerwonego:Jak wygenerować mapowanie z liczb na kolory w R?

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

Jak można łatwo mapować wektor liczb na tej palecie? Powiedzmy, Mam wektor liczb od 0 do 10, podobnie jak to:

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

Chciałbym funkcję, powiedzmy map2color tak, że gdy uruchamiam map2color(mypal, x), mam

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

zwykle wykonaj coś podobnego do następującego, ale może jest lepsze rozwiązanie OOB, automatycznie generujące skalę kolorów dla wektora liczbowego.

+0

Możesz mieć więcej szczęścia w przestrzeni kolorów HCL i zmieniać luminację, patrz '? Hcl' – James

Odpowiedz

4

paczkę colourscheme na R-Forge robi:

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

jego głównym celem jest stworzenie funkcje mapowania wartości liczbowe (nie tylko liczby całkowite kolorów) do kolorów. Winieta jest najlepszą dokumentacją, gdy już ją zainstalujesz.

+0

Brzmi interesująco! Czy mogę zapytać, dlaczego nie przesłałeś go do CRAN? (Nie mogę zainstalować go z install.packages, musiałem użyć svn) – January

+0

To był dość szybki doraźny hack, dokumentacja jest trochę bzdurna, i miałem nadzieję, że może nabrać trochę rozpędu i użycia - ale to nigdy nie zrobił... – Spacedman

+0

Tak, ale ja bym go znalazł i go nie znalazłem, ponieważ nie było go na CRAN :-) – January

4

Można spróbować

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

, ale to różni się od wyniku OP, czyż nie? – agstudy

+2

Nie, to nie zadziała, bliskie liczby powinny mieć bardzo podobne kolory. Weź c (1, 2, 3, 200); pierwsze trzy cyfry powinny znajdować się blisko początku kolorowej scali, a użycie rang 3 będzie już niebieskie. – January

+0

To może nie rozwiązać problemu styczniowego, ale rozwiązuje różne problemy, przypadek, w którym chcesz rozróżnić wszystkie numery w przypadku 1,2,3 i 200 –

3

Oto funkcja 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" 

Musiałem coś takiego stworzyć colorramp które byłyby spójne różnych próbek danych, więc dodałam xlim parametr. Dziękuję za przypomnienie funkcji findInterval w Twoim pytaniu.

2

Najprostszą rzeczą, jaką mogę myśleć jest dyskretyzację zmiennej xz cut a następnie przy użyciu współczynnika wynikowy do indeksu koloru Palety jak heat.colors lub cm.colors

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

zobaczyć ?heat.colors więcej szczegółów palet.

Ta funkcja daje wektor koloru odpowiadający x o różnej ziarnistości proporcjonalnej do n.

Powiązane problemy