it-swarm.cn

如何在R中的散点图中为每个类赋予颜色?

在数据集中,我想采用两个属性并创建监督的散点图。有谁知道如何给每个班级使用不同的颜色?

我试图在plot命令中使用col == c("red","blue","yellow"),但不确定是否像我再添加一种颜色一样正确,即使我只有3个类,该颜色也会出现在散点图中。

谢谢

42
Pallavi

这是使用传统图形(和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)
61
Aniko

这是我基于 此页面 构建的示例。

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

16
Ramnath

一种方法是使用网格包和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()等更不透明(对我来说至少是:)。

10
Dirk Eddelbuettel

这是我在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
Ozan147

如果您将类分隔在数据帧或矩阵中,则可以使用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值,则可以有datxdaty等。

另一种方法是添加一个额外的列,以指定所需的颜色(或保留一个额外的颜色向量,用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])
2
user554546

假设类变量为z,则可以使用:

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

但是,z是一个因子变量很重要,因为R在内部将因子存储为整数。

这样,1是“黑色”,2是“红色”,3是“绿色”..。

0
heschmat