web-dev-qa-db-fra.com

Comment donner de la couleur à chaque classe dans le nuage de points en R?

Dans un jeu de données, je veux prendre deux attributs et créer un diagramme de dispersion supervisé. Est-ce que quelqu'un sait comment donner une couleur différente à chaque classe? 

J'essaie d'utiliser col == c("red","blue","yellow") dans la commande de tracé, mais je ne suis pas sûr que ce soit correct, car si j'inclus une couleur supplémentaire, cette couleur apparaît également dans le diagramme de dispersion, même si je n'ai que 3 classes.

Merci

40
Pallavi

Voici une solution utilisant des graphiques traditionnels (et les données de Dirk):

> DF <- data.frame(x=1:10, y=rnorm(10)+5, z=sample(letters[1:3], 10, replace=TRUE)) 
> DF
    x        y z
1   1 6.628380 c
2   2 6.403279 b
3   3 6.708716 a
4   4 7.011677 c
5   5 6.363794 a
6   6 5.912945 b
7   7 2.996335 a
8   8 5.242786 c
9   9 4.455582 c
10 10 4.362427 a
> attach(DF); plot(x, y, col=c("red","blue","green")[z]); detach(DF)

Cela repose sur le fait que DF$z est un facteur. Par conséquent, lorsqu’il est sous-défini, ses valeurs sont traitées comme des entiers. Ainsi, les éléments du vecteur de couleur varieront avec z comme suit:

> c("red","blue","green")[DF$z]
 [1] "green" "blue"  "red"   "green" "red"   "blue"  "red"   "green" "green" "red"    

Vous pouvez ajouter une légende à l'aide de la fonction legend:

legend(x="topright", legend = levels(DF$z), col=c("red","blue","green"), pch=1)
57
Aniko

Voici un exemple que j'ai construit basé sur cette page .

library(e1071); library(ggplot2)

mysvm      <- svm(Species ~ ., iris)
Predicted  <- predict(mysvm, iris)

mydf = cbind(iris, Predicted)
qplot(Petal.Length, Petal.Width, colour = Species, shape = Predicted, 
   data = iris)

Cela vous donne la sortie. Vous pouvez facilement repérer les espèces mal classées à partir de cette figure.

enter image description here

14
Ramnath

Une solution consiste à utiliser le paquetage réseau et xyplot ():

R> DF <- data.frame(x=1:10, y=rnorm(10)+5, 
+>                  z=sample(letters[1:3], 10, replace=TRUE))
R> DF
    x       y z
1   1 3.91191 c
2   2 4.57506 a
3   3 3.16771 b
4   4 5.37539 c
5   5 4.99113 c
6   6 5.41421 a
7   7 6.68071 b
8   8 5.58991 c
9   9 5.03851 a
10 10 4.59293 b
R> with(DF, xyplot(y ~ x, group=z))

En donnant des informations de regroupement explicites via la variable z, vous obtenez des couleurs différentes. Vous pouvez spécifier des couleurs, etc., voir la documentation sur le réseau.

Comme z voici une variable factorielle pour laquelle nous obtenons les niveaux (== indices numériques), vous pouvez aussi faire 

R> with(DF, plot(x, y, col=z))

mais c’est moins transparent (du moins pour moi :) alors xyplot() et al.

9
Dirk Eddelbuettel

Si vous avez les classes séparées dans un cadre de données ou une matrice, vous pouvez utiliser matplot. Par exemple, si nous avons

dat<-as.data.frame(cbind(c(1,2,5,7),c(2.1,4.2,-0.5,1),c(9,3,6,2.718)))

plot.new()
plot.window(c(0,nrow(dat)),range(dat))
matplot(dat,col=c("red","blue","yellow"),pch=20)

Ensuite, vous obtiendrez un diagramme de dispersion où la première colonne de dat sera tracée en rouge, la seconde en bleu et la troisième en jaune. Bien sûr, si vous souhaitez séparer les valeurs x et y de vos classes de couleurs, vous pouvez avoir datx et daty, etc.

Une autre approche consisterait à fixer une colonne supplémentaire en spécifiant la couleur souhaitée (ou à conserver un vecteur de couleurs supplémentaire en la remplissant de manière itérative avec une boucle for et quelques branches if). Par exemple, cela vous donnera la même parcelle:

dat<-as.data.frame(
    cbind(c(1,2,5,7,2.1,4.2,-0.5,1,9,3,6,2.718)
    ,c(rep("red",4),rep("blue",4),rep("yellow",4))))

dat[,1]=as.numeric(dat[,1]) #This is necessary because
                            #the second column consisting of strings confuses R
                            #into thinking that the first column must consist of strings, too
plot(dat[,1],pch=20,col=dat[,2])
2
user554546

En supposant que la variable de classe est z, vous pouvez utiliser: 

with(df, plot(x, y, col = z))

cependant, il est important que z soit une variable de facteur, car R stocke en interne les facteurs sous forme d'entiers. 

De cette façon, 1 est "noir", 2 est "rouge", 3 est "vert, ....

0
heschmat

Voici comment je le fais en 2018. Qui sait, peut-être qu'un débutant R le verra-t-il un jour et tombera-t-il amoureux de ggplot2.

library(ggplot2)

ggplot(data = iris, aes(Petal.Length, Petal.Width, color = Species)) +
  geom_point() +
  scale_color_manual(values = c("setosa" = "red", "versicolor" = "blue", "virginica" = "yellow"))
0
Ozan147