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 ??
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.
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.
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:
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/
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:
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)
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:
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:
Nifty, non?
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)
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.