2011-09-19 17 views
35

En un conjunto de datos, quiero tomar dos atributos y crear un diagrama de dispersión supervisado. ¿Alguien sabe cómo dar diferente color a cada clase?Cómo dar color a cada clase en el diagrama de dispersión en R?

Estoy tratando de usar col == c("red","blue","yellow") en el comando de trazado, pero no estoy seguro si es correcto como si incluyera un color más, ese color también viene en el diagrama de dispersión aunque solo tengo 3 clases.

Gracias

Respuesta

2

Si tiene las clases separadas en una trama de datos o una matriz, entonces se puede utilizar matplot. Por ejemplo, si tenemos

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) 

Luego le ponen un diagrama de dispersión, donde la primera columna de dat se representa en rojo, la segunda en azul, y el tercero en amarillo. Por supuesto, si quieres x separadas y valores de y para sus clases de color, entonces puede tener datx y daty, etc.

Un enfoque alternativo sería la de virar en una columna adicional que especifica qué color usted quiere (o mantener una vector adicional de colores, llenándolo iterativamente con un bucle for y algunas ramas if). Por ejemplo, esto le ayudará a la misma parcela:

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]) 
9

Una forma es utilizar el paquete de celosía y 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)) 

Al dar información de agrupamiento explícita, mediante la variación z, se obtienen diferentes colores. Puede especificar colores, etc., consulte la documentación de celosía.

Debido z aquí es una variable de factor por el cual se obtienen los niveles (== índices numéricos), también se puede hacer

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

pero que es menos transparente (para mí, al menos :) entonces xyplot() et al.

13

Aquí hay un ejemplo que construí basado en this 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) 

Esto le da la salida. Puede detectar fácilmente las especies mal clasificadas de esta figura.

enter image description here

52

Aquí es una solución utilizando los gráficos tradicionales (y los datos 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) 

Esto se basa en el hecho de que DF$z es un factor, por lo que cuando subsetting por ella, sus valores será tratado como enteros.Por lo que los elementos del vector de color variarán con z de la siguiente manera:

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

Usted puede agregar una leyenda utilizando la función legend:

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

¿Cómo agregar una leyenda utilizando la función de leyenda? –

+2

@ tommy.carstensen He agregado un ejemplo de leyenda – Aniko

+0

Y si tiene muchos grupos y no desea especificar cada color, intente utilizar la función _grDevices_ 'colorRampPalette'. [enlace] (http://r.789695.n4.nabble.com/alternatives-to-RColorBrewer-td852872.html) – Rnoob

0

supone que la variable de clase es z, puede utilizar:

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

Sin embargo, es importante que z sea una variable de factor, ya que R almacena internamente factores como enteros.

De esta manera, 1 es 'negro', 2 es 'rojo', es decir 3 'verde, ....

Cuestiones relacionadas