123 votes

Gradient de n couleurs allant de la couleur 1 et de la couleur 2

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

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

dont je suis bien conscient :

brewer.pal(8, "Spectral") 

de RColorBrewer . Je cherche plutôt une approche similaire à la manière dont ggplot2 manipule des gradients qui dit que j'ai ces deux couleurs et je veux 15 couleurs le long du chemin. Comment puis-je faire cela ?

201voto

thelatemail Points 21202

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 ça marche :

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

enter image description here

22voto

Daniel Hoop Points 517

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)

enter image description here

1voto

arranjdavis Points 297

Une autre approche (qui n'est pas nécessairement meilleure que les réponses précédentes !) consiste à utiliser la fonction viridis paquet. Comme expliqué aquí Il permet d'obtenir une variété de dégradés de couleurs basés sur plus de deux couleurs.

Le paquet est assez facile à utiliser - il suffit de remplacer l'élément ggplot2 fonction de remplissage de l'échelle (par exemple, scale_fill_gradient(low = "skyblue", high = "dodgerblue4") ) avec l'équivalent viridis fonction.

Donc, changez le code pour cette parcelle :

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = hp)) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Horse power') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_fill_gradient(low = "skyblue", high = "dodgerblue4") +
  theme_classic()

Ce qui produit :

enter image description here

À cela, qui utilise viridis :

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = factor(cyl))) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Number\nof cylinders') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_color_viridis(discrete = TRUE) +
  theme_classic()

La seule différence est dans l'avant-dernière ligne : scale_color_viridis(discrete = TRUE) .

C'est le tracé qui est produit en utilisant viridis :

enter image description here

J'espère que quelqu'un trouvera cela utile, car c'est la solution que j'ai fini par utiliser après avoir trouvé cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X