Подтвердить что ты не робот

Как дать цвет каждому классу в диаграмме рассеяния в R?

В наборе данных я хочу взять два атрибута и создать контролируемый график рассеяния. Кто-нибудь знает, как давать разные цвета каждому классу?

Я пытаюсь использовать col == c("red","blue","yellow") в команде plot, но не уверен, что он прав, как если бы я включал еще один цвет, этот цвет также входит в график рассеяния, хотя у меня есть только 3 класса.

Спасибо

4b9b3361

Ответ 1

Вот решение, использующее традиционную графику (и данные 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)

Это зависит от того, что DF$z является фактором, поэтому при подмножестве с ним его значения будут рассматриваться как целые числа. Таким образом, элементы цветового вектора будут меняться с z следующим образом:

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

Вы можете добавить легенду, используя функцию legend:

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

Ответ 2

Вот пример, который я построил на основе этой страницы.

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)

Это даст вам результат. Вы можете легко обнаружить несогласованные виды из этого рисунка.

enter image description here

Ответ 3

Один из способов - использовать пакет решетки и 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))

Предоставляя явную информацию группировки с помощью переменной z, вы получаете разные цвета. Вы можете указать цвета и т.д., См. Документацию по решетке.

Поскольку z здесь есть фактор-переменная, для которой мы получаем уровни (== числовые индексы), вы также можете сделать

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

но это менее прозрачно (для меня, по крайней мере:) then xyplot() et al.

Ответ 4

Если у вас есть классы, разделенные в кадре данных или матрице, вы можете использовать matplot. Например, если мы имеем

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)

Затем вы получите диаграмму рассеяния, где первый столбец dat изображен красным, второй - синим, а третий - желтым. Конечно, если вам нужны отдельные значения x и y для ваших цветовых классов, вы можете иметь datx и daty и т.д.

Альтернативный подход заключается в том, чтобы использовать дополнительный столбец, определяющий, какой цвет вы хотите (или сохраняя дополнительный вектор цветов, заполняя его итеративно контуром for и некоторыми ветвями if). Например, это даст вам тот же сюжет:

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

Ответ 5

Предполагая, что переменная класса равна z, вы можете использовать:

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

однако важно, чтобы z была фактор-переменной, поскольку R внутренне хранит факторы как целые числа.

Таким образом, 1 является "черным", 2 - "красным", 3 - "зеленым",....