Как дать цвет каждому классу в диаграмме рассеяния в R?
В наборе данных я хочу взять два атрибута и создать контролируемый график рассеяния. Кто-нибудь знает, как давать разные цвета каждому классу?
Я пытаюсь использовать col == c("red","blue","yellow")
в команде plot, но не уверен, что он прав, как если бы я включал еще один цвет, этот цвет также входит в график рассеяния, хотя у меня есть только 3 класса.
Спасибо
Ответы
Ответ 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 - "зеленым",....