在数据集中,我想采用两个属性并创建有监督的散点图。有谁知道如何为每个班级提供不同的颜色?
我正在尝试在绘图命令中使用col == c("red","blue","yellow")
,但不确定它是否正确就像我再包含一种颜色一样,即使我只有3个类,该颜色也会出现在散点图中。
由于
答案 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)
这为您提供输出。你可以很容易地从这个数字中发现错误分类的物种。
答案 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值,那么您可以拥有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])
答案 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更长,但我今天不想学习全新的东西,希望这对某人有帮助!