Gradient n kolorów w zakresie od koloru 1 do koloru 2

108

Często pracuję z ggplot2tym, że gradienty są ładne ( kliknij tutaj, aby zobaczyć przykład ). Muszę pracować w bazie i myślę, że scalesmogę tam również tworzyć gradienty kolorów, ale bardzo nie wiem, jak. Podstawowym celem jest wygenerowanie palety n kolorów w zakresie od koloru x do koloru y. Rozwiązanie musi jednak działać w bazie. To był punkt wyjścia, ale nie ma miejsca na wprowadzenie n.

 scale_colour_gradientn(colours=c("red", "blue"))

Doskonale zdaję sobie sprawę z:

brewer.pal(8, "Spectral") 

od RColorBrewer. Szukam bardziej podejścia podobnego do tego, jak ggplot2obsługuje gradienty, które mówi, że mam te dwa kolory i chcę po drodze 15 kolorów. Jak mogę to zrobić?

Tyler Rinker
źródło
1
Myślę, że potrzebujesz pakietu wagi ; najnowsze wersje ggplot2 zależą od tego dla podstawowego kodu. Oznacza to, że nie potrzebujesz ggplot2 do korzystania z wag, potrzebujesz tylko pakietu scales . Nie mam pojęcia, jak działają funkcje w wagach :-)
Gavin Simpson
1
Nie na temat, ponieważ basespecjalnie o to prosiłeś , ale uważam colourvalues( również w CRAN ) za szczególnie wygodne do mapowania wartości na gradient. Jest również dość lekki (w zależności od Rcpp).
MichaelChirico
@MichaelChirico Nie poza tematem, chodziło mi o to, że muszę użyć kreślenia bazowego, ponieważ pakiet, którego używałem, był napisany w bazie (myślę, że chmura słów), a nie w siatce. Może opublikuj jako odpowiedź?
Tyler Rinker

Odpowiedzi:

179

colorRampPalette może być twoim przyjacielem tutaj:

colfunc <- colorRampPalette(c("black", "white"))
colfunc(10)
# [1] "#000000" "#1C1C1C" "#383838" "#555555" "#717171" "#8D8D8D" "#AAAAAA"
# [8] "#C6C6C6" "#E2E2E2" "#FFFFFF"

I żeby pokazać, że to działa:

plot(rep(1,10),col=colfunc(10),pch=19,cex=3)

wprowadź opis obrazu tutaj

thelatemail
źródło
14
Zauważ, że jeśli jesteś szczególnie zakochany w istniejącej palecie, np. brewer.pal(8, "Spectral")Możesz dać wynikowy wektor kolorów, colorRampPaletteaby wygenerować więcej kolorów wzdłuż tej rampy. Na przykład: colorRampPalette(brewer.pal(8, "Spectral")).
jbaums
A co z kolorem z liniami lub kształtami diagonoal w bloku? @thelatemail
user3631848
50

Aby rozwinąć poprzednią odpowiedź, colorRampPalettemożna obsłużyć więcej niż dwa kolory.

Aby uzyskać bardziej rozszerzony wygląd typu „mapa cieplna”, możesz ....

colfunc<-colorRampPalette(c("red","yellow","springgreen","royalblue"))
plot(rep(1,50),col=(colfunc(50)), pch=19,cex=2)

Powstały obraz:

wprowadź opis obrazu tutaj

jsol
źródło
czy mogę również określić w kolorze ukośne linie lub kształty? @jsol
user3631848
Podoba mi się ta paleta, ale jest zdecydowanie za dużo zieleni i bardzo mało żółci. Czy jest sposób, aby to poprawić?
Herman Toothrot
1
Dodanie dla każdego, kto nie spodziewał się zobaczyć opcji takiej jak „wiosenny zielony” lub „królewski błękit”. Wszystkie dostępne kolory mogą zostać zwrócone jako lista, uruchamiając: colors ().
jadki
20

Spróbuj wykonać następujące czynności:

color.gradient <- function(x, colors=c("red","yellow","green"), colsteps=100) {
  return( colorRampPalette(colors) (colsteps) [ findInterval(x, seq(min(x),max(x), length.out=colsteps)) ] )
}
x <- c((1:100)^2, (100:1)^2)
plot(x,col=color.gradient(x), pch=19,cex=2)

wprowadź opis obrazu tutaj

Daniel Hoop
źródło
ta funkcja powinna być dodana domyślnie w bazie R!
Simon C.
7

Powyższa odpowiedź jest przydatna, ale na wykresach trudno jest odróżnić ciemniejsze gradienty czerni. Jedną z alternatyw, które znalazłem, jest użycie gradientów szarości w następujący sposób

palette(gray.colors(10, 0.9, 0.4))
plot(rep(1,10),col=1:10,pch=19,cex=3))

Więcej informacji na temat skali szarości tutaj.

Dodany

Kiedy użyłem powyższego kodu dla różnych kolorów, takich jak niebieski i czarny, gradienty nie były tak wyraźne. heat.colors()wydaje się bardziej przydatne.

Ten dokument zawiera bardziej szczegółowe informacje i opcje. pdf

Anusha
źródło
2
Myślę, że ta odpowiedź jest lepsza dla czerni niż bieli, ale nie można jej uogólnić na kolory. Dziękujemy za dodanie tych cennych informacji. +1
Tyler Rinker
Dodano łącze, które zapewnia lepsze opcje gradientów kolorów i odcieni, które działają zarówno w kolorze, jak i w czerni.
Anusha
@DavidDelMonte Być może mam zapisaną kopię pliku, ale nie mam zaktualizowanego łącza. Nie wiem jednak, gdzie go przesłać.
Anusha
2
@DavidDelMonte - web.archive.org/web/20141111182737/http://www.stat.tamu.edu/ ... zawsze sprawdzaj najpierw archive.org.
thelatemail