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

Pal*_*avi 43 plot r

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

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

谢谢

Ani*_*iko 64

这是使用传统图形(和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)
Run Code Online (Sandbox Code Playgroud)

这取决于DF$z一个因素,因此当通过它进行子集化时,其值将被视为整数.因此,颜色矢量的元素将z如下变化:

> c("red","blue","green")[DF$z]
 [1] "green" "blue"  "red"   "green" "red"   "blue"  "red"   "green" "green" "red"    
Run Code Online (Sandbox Code Playgroud)

您可以使用以下legend函数添加图例:

legend(x="topright", legend = levels(DF$z), col=c("red","blue","green"), pch=1)
Run Code Online (Sandbox Code Playgroud)

  • @ tommy.carstensen我添加了一个传奇例子 (2认同)

Ram*_*ath 16

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

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)
Run Code Online (Sandbox Code Playgroud)

这给你输出.您可以轻松地从该图中发现错误分类的物种.

在此输入图像描述


Dir*_*tel 10

一种方法是使用晶格包和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))
Run Code Online (Sandbox Code Playgroud)

通过变量提供明确的分组信息z,您可以获得不同的颜色.您可以指定颜色等,请参阅晶格文档.

因为z这是一个我们获得水平(==数字指数)的因子变量,你也可以这样做

R> with(DF, plot(x, y, col=z))
Run Code Online (Sandbox Code Playgroud)

但那不太透明(对我来说,至少:)然后xyplot()等.


Oza*_*147 6

这是我在 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"))
Run Code Online (Sandbox Code Playgroud)


小智 2

如果您将类分隔在数据框或矩阵中,那么您可以使用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)
Run Code Online (Sandbox Code Playgroud)

然后您将得到一个散点图,其中 的第一列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])
Run Code Online (Sandbox Code Playgroud)