Как придать цвет каждому классу на точечной диаграмме в R? - PullRequest
42 голосов
/ 19 сентября 2011

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

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

Спасибо

Ответы [ 6 ]

61 голосов
/ 19 сентября 2011

Вот решение, использующее традиционную графику (и данные Дирка):

> 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)
16 голосов
/ 19 сентября 2011

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

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

10 голосов
/ 19 сентября 2011

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

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

2 голосов
/ 30 июля 2018

Вот как я это делаю в 2018 году. Кто знает, может новичок R увидит это однажды и влюбится в 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"))
2 голосов
/ 19 сентября 2011

Если у вас есть классы, разделенные во фрейме данных или матрице, вы можете использовать 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])
0 голосов
/ 02 апреля 2016

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

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

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

Таким образом, 1 - «черный», 2 - «красный», 3 - «зеленый», ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...