web-dev-qa-db-fra.com

Comment définir des valeurs de couleurs continues fixes dans ggplot2

Je dessine beaucoup de graphismes et j'aimerais que tous aient la même échelle de couleurs afin que je puisse les comparer. Voici mon code:

myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
print(ggplot(mydata, aes(x= X, y= Y, colour= Z)) + geom_point(alpha=.5,size = 6) + scale_colour_gradientn(colours = myPalette(100)) + ylim(.1,.4) + xlim(1.5,2) + ggtitle(title))

Y at-il un moyen de définir cette échelle de couleur?

16
Rodolphe

Est-ce que je comprends bien? Vous avez deux tracés, où les valeurs de l'échelle de couleurs sont mappées vers des couleurs différentes sur des tracés différents, car les tracés ne contiennent pas les mêmes valeurs.

library("ggplot2")
library("RColorBrewer")
ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6)

enter image description here

ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6)

enter image description here

Dans le haut, le bleu foncé est 1 et le bleu clair, 4, tandis que dans le bas, le bleu foncé est (toujours) 1, mais le bleu clair est maintenant de 8.

Vous pouvez corriger les extrémités de la barre de couleur en donnant un argument limits à l'échelle; il devrait couvrir toute la plage que les données peuvent prendre dans n'importe quelle parcelle. En outre, vous pouvez affecter cette échelle à une variable et l'ajouter à tous les graphes (pour réduire le code redondant de sorte que la définition ne se trouve qu'à un seul endroit et non dans chaque plot).

myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
sc <- scale_colour_gradientn(colours = myPalette(100), limits=c(1, 8))

ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6) + sc

enter image description here

ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
  geom_point(size=6) + sc

enter image description here

37
Brian Diggs

Il y a peut-être une meilleure façon de faire cela, mais je ne le sais pas. En attendant, vous devez vous assurer que l'argument values de scale_colour_gradientn est tel que les valeurs de tous vos tracés correspondent aux couleurs correctes. Donc, ici, je fais deux parcelles avec la même correspondance entre 0 et 100, mais l'une d'elles a des valeurs de 50 à 150:

mydata <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 0, 100))
p1 <- ggplot(mydata, aes(x=X, y=Y, colour=Z)) + 
  geom_point(alpha=.5, size = 6) + 
  scale_colour_gradientn(colours = myPalette(100), values=seq(0, 100, length.out=100)/100) + 
  ggtitle("Z: 0 - 100")

C'est le bit clé:

mydata2 <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 50, 150))
nrm.range.2 <- (range(mydata$Z) - min(mydata2$Z)) / diff(range(mydata2$Z))
nrm.vals <- seq(nrm.range.2[[1]], nrm.range.2[[2]], length.out=100)

Maintenant, faites le deuxième complot.

p2 <- ggplot(mydata2, aes(x=X, y=Y, colour=Z)) + 
  geom_point(alpha=.5, size = 6) + 
  scale_colour_gradientn(colours = myPalette(100), values=nrm.vals) + 
  ggtitle("Z: 50 - 150")

enter image description here

Je ne sais pas comment forcer la plage d'affichage des valeurs sur l'échelle, mais dans la mesure où vous avez plusieurs tracés dont les plages de valeurs Z ne se chevauchent pas, vous pouvez créer un troisième tracé factice avec toute la plage et l'utiliser. Ici, je me suis volontairement écarté pour montrer que les valeurs qui se chevauchent ont les mêmes couleurs.

3
BrodieG

Ok, prenons donc l'ensemble de données de l'exemple précédent: 

library(ggplot2)
library(RColorBrewer)
library(gridExtra)
library(gtablegridExtra)

#Using the mtcars data set

#Generate plot 1
p1=ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
          geom_point(size=2)+
          labs(title="Graph 1")+
          scale_color_gradientn(colours=Rainbow(5))

#Generate plot 2
p2=ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
          geom_point(size=2)+
          labs(title="Graph 2")+
          scale_color_gradientn(colours=Rainbow(5)) 

Donc, si nous traçons ensemble les deux graphiques en utilisant grid.arrange, vous devriez obtenir ceci: 

grid.arrange(arrangeGrob(p1,
                         p2,
                         nrow = 1))

Graphes sans échelle de couleur équivalente

Nous voulons donc obtenir la même plage pour les deux graphiques et tracer un seul de ces sacos colos. Ce que vous devez faire, c'est d'abord définir la plage de l'échelle de couleurs. dans cet exemple, faisons le à partir de: 

summary(mtcars$carb)

>
Min.   1st Qu.  Median  Mean   3rd Qu.   Max. 
1.000   2.000   2.000   2.812   4.000   8.000 

Nous savons donc que l’échelle de couleur doit être comprise entre 1 et 8. Nous définissons cette plage comme étant col.range et nous l’utilisons ensuite pour spécifier la plage dans chaque graphique: 

#Define color range
col.range=c(1,8)

#Generate plot 1
p1=ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) + 
          geom_point(size=2)+
          labs(title="Graph 1")+
          scale_color_gradientn(colours=Rainbow(5),limits=col.range) #look here

#Generate plot 2
p2=ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) + 
          geom_point(size=2)+
          labs(title="Graph 2")+
          scale_color_gradientn(colours=Rainbow(5),limits=col.range) #look here 


#Plot both graphs together
 grid.arrange(arrangeGrob(p1,
                          p2,
                          nrow = 1))

Cela vous donnera le graphique suivant. Maintenant, la couleur est comparable entre les deux graphiques. 

Graphiques avec la même échelle de couleur

Toutefois, l’échelle des colos répétés est redondante, nous ne voulons donc en utiliser qu’une seule. 

Donc, pour obtenir ce graphe final de Nice, nous pouvons utiliser les mêmes graphes p1 et p2 que nous avons définis précédemment, nous avons juste précisé la fonction grid.arrange comme: 

#Create al element that will represent your color scale:
color.legend=gtable_filter(ggplotGrob(p1),"guide-box")

#We hide de color scale on each individual graph
#Then we insert the color scale and we adjust the ratio of it with the graphs
#For this we define the theme() as follows:

grid.arrange(arrangeGrob(p1+theme(legend.position="none"),
                         p2+theme(legend.position="none"),
                         nrow = 1), #Here we have just remove the color scale
             color.scale, #We inserted the color scale. 
             nrow=1, #We put the color scale to the right of the graph
             widths=c(20,1) #With this we make the color scale much narrower

Donc, avec cela, vous avez terminé, en obtenant le graphique suivant: 

Graphiques avec une seule échelle de couleur

L'espoir est utile !!!!!!

Veuillez noter s'il vous plaît!!!!! <3

0
Mario del Pino