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

时间:2011-09-19 02:53:38

标签: r plot

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

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

由于

7 个答案:

答案 0 :(得分:60)

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

答案 1 :(得分:16)

以下是我根据this page构建的示例。

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

答案 2 :(得分:10)

一种方法是使用lattice包和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()等人。

答案 3 :(得分: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)

然后你会得到一个散点图,其中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])

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

with(df, plot(x, y, col = z))
然而,重要的是z是因子变量,因为R在内部将因子存储为整数。

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

答案 6 :(得分:0)

这篇文章很老,但是我花了很长时间试图弄清楚这一点,所以我想我会发布更新的回复。我的主要消息来源是这张精彩的PowerPoint:http://www.lrdc.pitt.edu/maplelab/slides/14-Plotting.pdf。好的,这就是我所做的:

在此示例中,我的数据集称为“数据”,我正在将“触摸”数据与“凝视”数据进行比较。受试者分为两组:“红色”和“蓝色”。

`plot(Data$Touch[Data$Category == "Blue"], Data$Gaze[Data$Category == "Blue"], main = "Touch v Gaze", xlab = "Gaze(s)", ylab = "Touch (s)", col = "blue", pch = 20)`
  • 这组代码创建了我的Blue组的Touch v Gaze散点图

    par(new = TRUE)

  • 这告诉R创建一个新图。当您一起运行所有代码时,第二个图由R自动放置在第一个图上

    plot(Data$Touch[Data$Category == "Red"], Data$Gaze[Data$Category == "Red"], axes = FALSE, xlab = "", ylab = "", col = "red", pch = 2)

  • 这是第二个情节。我在编写这些代码时发现R不仅将数据点放在Blue绘图上,而且还放置了轴,轴标题和主标题。

  • 为消除烦人的重叠问题,我使用了axes函数来消除坐标轴本身,并将标题设置为空白。

    legend(x = 60, y = 50, legend = c("Blue", "Red"), col = c("blue", "red"), pch = c(20, 2))

  • 添加漂亮的图例以使项目更完整

这种方式可能比漂亮的ggplots更长,但我今天不想学习全新的东西,希望这对某人有帮助!