Dégradé de n couleurs allant de la couleur 1 à la couleur 2

108

Je travaille souvent avec ggplot2qui rend les dégradés agréables ( cliquez ici pour un exemple ). J'ai besoin de travailler dans la base et je pense que cela scalespeut également être utilisé pour créer des dégradés de couleurs, mais je ne sais pas comment. L'objectif de base est de générer une palette de n couleurs allant de x couleur à y couleur. La solution doit cependant fonctionner en base. C'était un point de départ mais il n'y a pas de place pour saisir un n.

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

Je connais bien:

brewer.pal(8, "Spectral") 

de RColorBrewer. Je recherche davantage l'approche similaire à la façon dont ggplot2gère les dégradés qui dit que j'ai ces deux couleurs et que je veux 15 couleurs en cours de route. Comment puis je faire ça?

Tyler Rinker
la source
1
Je pense que vous avez besoin du paquet de balances ; les dernières versions de ggplot2 en dépendent pour le code sous-jacent. -À- dire que vous n'avez pas besoin ggplot2 d'utiliser des échelles, il vous suffit de l' échelle package. Je ne sais pas comment les fonctions des échelles fonctionnent cependant :-)
Gavin Simpson
1
Hors sujet puisque vous l'avez demandé basespécifiquement, mais je trouve colourvalues( également sur CRAN ) particulièrement pratique pour mapper des valeurs sur un dégradé. Il est également assez léger (dépend de Rcpp).
MichaelChirico
@MichaelChirico Pas hors sujet, ce que je voulais dire, c'est que je devais utiliser le traçage de base car le package que j'utilisais était écrit en base (je pense que wordcloud) plutôt qu'en grille. Peut-être publier comme réponse?
Tyler Rinker

Réponses:

179

colorRampPalette pourrait être votre ami ici:

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

Et juste pour montrer que cela fonctionne:

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

entrez la description de l'image ici

le courrier électronique
la source
14
Notez que si vous êtes particulièrement amoureux d'une palette préexistante, par exemple brewer.pal(8, "Spectral"), vous pouvez donner le vecteur de couleurs résultant à colorRampPalettepour générer plus de couleurs le long de cette rampe. Par exemple: colorRampPalette(brewer.pal(8, "Spectral")).
jbaums
Qu'en est-il de la couleur des lignes ou des formes diagonales dans le bloc? @thelatemail
user3631848
50

Juste pour développer la réponse précédente colorRampPalettepeut gérer plus de deux couleurs.

Donc, pour un look de type "heat map" plus étendu, vous pouvez ...

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

L'image résultante:

entrez la description de l'image ici

jsol
la source
puis-je également spécifier les lignes diagonales ou les formes dans la couleur? @jsol
user3631848
J'aime cette palette mais il y a beaucoup trop de vert et très peu de jaune. Y a-t-il un moyen de corriger cela?
Herman Toothrot
1
Ajout pour tous ceux qui ne s'attendaient pas à voir une option comme "springgreen" ou "royalblue". Toutes les couleurs disponibles à utiliser peuvent être renvoyées sous forme de liste en exécutant: colors ().
jadki
20

Essayez ce qui suit:

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)

entrez la description de l'image ici

Daniel Hoop
la source
cette fonction doit être ajoutée par défaut dans R base!
Simon C. le
7

La réponse ci-dessus est utile mais dans les graphiques, il est difficile de distinguer les dégradés de noir plus foncés. Une alternative que j'ai trouvée est d'utiliser des dégradés de couleurs grises comme suit

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

Plus d'informations sur l'échelle de gris ici.

Ajoutée

Lorsque j'ai utilisé le code ci-dessus pour différentes couleurs comme le bleu et le noir, les dégradés n'étaient pas si clairs. heat.colors()semble plus utile.

Ce document contient des informations et des options plus détaillées. pdf

Anusha
la source
2
Je pense que cette réponse est supérieure pour le noir au blanc mais n'est pas généralisable aux couleurs. Merci d'avoir ajouté ces précieuses informations. +1
Tyler Rinker
Ajout d'un lien qui offre de meilleures options pour les dégradés de couleurs et les teintes qui fonctionnent à la fois en couleur et en noir et blanc.
Anusha le
@DavidDelMonte J'ai peut-être une copie enregistrée du fichier mais pas le lien mis à jour. Je ne sais pas où le télécharger.
Anusha
2
@DavidDelMonte - web.archive.org/web/20141111182737/http ://www.stat.tamu.edu/... vérifiez d'abord archive.org toujours.
thelatemail