web-dev-qa-db-fra.com

Coloriage graphique par facteur en R

Je suis en train de faire un nuage de points de deux variables et j'aimerais colorier les points avec une variable facteur. Voici un code reproductible:

data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)

C’est très bien, mais comment puis-je savoir quel facteur a été coloré de quelle couleur ??

25
LoveMeow
data<-iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
legend(7,4.3,unique(data$Species),col=1:length(data$Species),pch=1)

devrait le faire pour vous. Mais je préfère ggplot2 et suggère que pour de meilleurs graphiques dans R.

49
Maiasaura

La commande palette vous indique les couleurs et leur ordre lorsque col = somefactor. Il peut également être utilisé pour définir les couleurs.

palette()
[1] "black"   "red"     "green3"  "blue"    "cyan"    "Magenta" "yellow"  "gray"   

Pour voir cela dans votre graphique, vous pouvez utiliser une légende.

legend('topright', legend = levels(iris$Species), col = 1:3, cex = 0.8, pch = 1)

Vous remarquerez que je n'ai spécifié que les nouvelles couleurs avec 3 chiffres. Cela fonctionnera comme si vous utilisiez un facteur. J'aurais pu utiliser le facteur utilisé à l'origine pour colorer les points également. Cela ferait logiquement tout aller ensemble ... mais je voulais simplement vous montrer que vous pouvez utiliser une variété de choses.

Vous pourriez aussi être spécifique sur les couleurs. Essayez ?rainbow pour commencer et à partir de là. Vous pouvez spécifier le vôtre ou laisser R le faire pour vous. Tant que vous utilisez la même méthode pour chacun, tout va bien.

37
John

Comme Maiasaura, je préfère ggplot2. Le manuel de référence transparent est l'une des raisons. Cependant, c'est un moyen rapide de le faire.

require(ggplot2)
data(diamonds)
qplot(carat, price, data = diamonds, colour = color)
# example taken from Hadley's ggplot2 book

Et parce que quelqu'un de célèbre a dit, les posts relatifs à l'intrigue ne sont pas complets sans l'intrigue, voici le résultat:

enter image description here

Voici quelques références: exemple avec qplot.R , notez que ceci utilise le même jeu de données diamant que celui que j'utilise, mais coupe les données avant pour obtenir de meilleures performances.

http://ggplot2.org/book/ le manuel: http://docs.ggplot2.org/current/

19
Matt Bannert

Je sais qu'il y a deux façons de colorer les points du tracé par facteur et de générer automatiquement une légende correspondante. Je vais donner des exemples des deux:

  1. Utiliser ggplot2 (généralement plus facile)
  2. Utiliser la fonctionnalité de traçage intégrée de R en combinaison avec la fonction colorRampPallete (plus compliqué, mais beaucoup de gens préfèrent/ont besoin des facilités de traçage intégrées de R)

Pour les deux exemples, je vais utiliser le jeu de données ggplot2 diamonds. Nous utiliserons les colonnes numériques diamond$carat Et diamond$price, Ainsi que la colonne facteur/catégorique diamond$color. Vous pouvez charger le jeu de données avec le code suivant si vous avez installé ggplot2:

library(ggplot2)
data(diamonds)

Utiliser ggplot2 et qplot

C'est un one-line. L'élément clé ici est de donner à qplot le facteur que vous voulez colorer en tant qu'argument color. qplot créera une légende pour vous par défaut.

qplot(
  x = carat,
  y = price,
  data = diamonds,
  color = diamonds$color # color by factor color (I know, confusing)
)

Votre sortie devrait ressembler à ceci: qplot output colored by factor "diamond$color"

Utilisation de la fonctionnalité de tracé intégrée de R

Utiliser la fonctionnalité de tracé intégrée de R pour obtenir un tracé coloré par un facteur et une légende associée est un processus en 4 étapes, et il est un peu plus technique que d'utiliser ggplot2.

Tout d'abord, nous allons créer une fonction colorRampPallete. colorRampPallete() renvoie une nouvelle fonction qui générera une liste de couleurs. Dans l'extrait ci-dessous, l'appel de color_pallet_function(5) renverrait une liste de 5 couleurs sur une échelle allant du rouge à l'orange au bleu:

color_pallete_function <- colorRampPalette(
  colors = c("red", "orange", "blue"),
  space = "Lab" # Option used when colors do not represent a quantitative scale
  )

Deuxièmement, nous devons dresser une liste de couleurs, avec exactement une couleur par couleur de diamant. C'est le mappage que nous utiliserons à la fois pour attribuer des couleurs à des points de tracé individuels et pour créer notre légende.

num_colors <- nlevels(diamonds$color)
diamond_color_colors <- color_pallet_function(num_colors)

Troisièmement, nous créons notre parcelle. Cela se fait comme n'importe quel autre scénario, sauf que nous nous référons à la liste de couleurs que nous avons créée sous la forme de notre argument col. Tant que nous utilisons toujours cette même liste, notre correspondance entre les couleurs et diamond$colors Sera cohérente dans notre script R.

plot(
  x = diamonds$carat,
  y = diamonds$price,
  xlab = "Carat",
  ylab = "Price",
  pch = 20, # solid dots increase the readability of this data plot
  col = diamond_color_colors[diamonds$color]
)

Enfin, nous ajoutons notre légende pour que quelqu'un lisant notre graphique puisse voir clairement la correspondance entre les couleurs du point de l’intrigue et les couleurs réelles du diamant.

legend(
  x ="topleft",
  legend = paste("Color", levels(diamonds$color)), # for readability of legend
  col = diamond_color_colors,
  pch = 19, # same as pch=20, just smaller
  cex = .7 # scale the legend to look attractively sized
)

Votre sortie devrait ressembler à ceci: standard R plot output colored by factor "diamond$color"

Nifty, non?

16
Toby

La bibliothèque lattice est une autre bonne option. Ici, j'ai ajouté une légende sur le côté droit et fait trembler les points car certains d'entre eux se chevauchaient.

xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris, 
       auto.key=list(space="right"), 
       jitter.x=TRUE, jitter.y=TRUE)

example plot

11
Aaron

L'argument col de la fonction plot attribue automatiquement les couleurs à un vecteur d'entiers. Si vous convertissez iris$Species to numeric, notez que vous avez un vecteur de 1,2 et 3s. Vous pouvez donc l’appliquer comme suit:

plot(iris$Sepal.Length, iris$Sepal.Width, col=as.numeric(iris$Species))

Supposons que vous vouliez du rouge, du bleu et du vert au lieu des couleurs par défaut, vous pouvez simplement l'ajuster:

plot(iris$Sepal.Length, iris$Sepal.Width, col=c('red', 'blue', 'green')[as.numeric(iris$Species)])

Vous pouvez probablement voir comment modifier davantage le code ci-dessus pour obtenir une combinaison unique de couleurs.

8
justin1.618