首页 文章

R中的散点图使用格子和 Cloud ,如何通过因子确定颜色?

提问于
浏览
1

我仍在努力研究R图和颜色 - 有些结果是我预期的,有些则没有 .

我有一个200万点数据集,由模拟过程生成 . 数据集上有几个变量,但我对三个以及描述该数据点的类的因素感兴趣 .

这是一段简短的代码,可以读取点并获得一些基本的统计信息:

library(lattice)
library(plyr)
myData <- read.table("dados - b1000 n10000 var 0,2 - MAX40.txt",
                col.names=c("Class","Thet1Thet2","Thet3Thet2","Thet3Thet1",
                            "K12","K23","delta","w_1","w_2","w_3"))
count (myData$Class)

这给了我

##   x    freq
## 1 A    8030
## 2 B   17247
## 3 C    4999
## 4 D   16495
## 5 E 1949884
## 6 N    3345

(输入文件非常大,无法将其添加为链接)

我想在散点图矩阵中看到这些点,所以我使用代码

colors=c("red","green","blue","cyan","magenta","yellow")
# Let's try with a very small dot size, see if we can visualize the inners of the cube.
cloud(myData$delta ~ myData$K12 + myData$K23, xlab="K12", ylab="K23", zlab="delta",
  cex=0.001,main="All Classes",col.point = colors[myData$Class])

这是结果 . 正如预期的那样,E级的分数占绝大多数,所以我看不到其他课程的分数 . 问题是我期望用洋红色绘制点(类别是A,B,C,D,E,N;颜色是红色,绿色,蓝色,青色,品红色,黄色) .

Why so blue?

当我按类完成绘图时,它按预期工作,请参阅两个示例:

data <- subset(myData, Class=="A")
cloud(data$delta ~ data$K12 + data$K23, xlab="K12", ylab="K23", zlab="delta",pch=20,main="Class A",
      col.point = colors[data$Class])

给出这个:

Only class A

这段代码

data <- subset(myData, Class=="E")
cloud(data$delta ~ data$K12 + data$K23, xlab="K12", ylab="K23", zlab="delta",pch=20,main="Class E",
      col.point = colors[data$Class])

给出这个:

enter image description here

这似乎也是预期的:除了E之外的所有类别的点数 .

data <- subset(myData, Class!="E")
cloud(data$delta ~ data$K12 + data$K23, xlab="K12", ylab="K23", zlab="delta",pch=20,
      cex=0.01,main="All Classes (except E)",col.point = colors[data$Class])

enter image description here

问题是, why on the first plot the points are blue instead of magenta?

这个问题在某种程度上类似于Color gradient for elevation data in a XYZ plot with R and Lattice,但现在我使用因子来确定散点图上的颜色 .

我也读过Changing default colours of a lattice plot by factor - 按因子分组图(使用参数groups.factor = myData $ Class)并没有解决我的问题,图仍然是蓝色但是按类分开 .

已编辑以添加更多信息:此假数据集可用于测试 .

num <- 10
data <- as.data.frame(
    cbind(
      x=rep(seq(1,num), each=num*num), 
      y=rep(seq(1,num), each=num), 
      z=rep(seq(1,num)) 
    ))
# This is ugly but works!
data$Class[data$z==1]<-'A'
data$Class[data$z==2]<-'A'
data$Class[data$z==3]<-'B'
data$Class[data$z==4]<-'B'
data$Class[data$z==5]<-'C'
data$Class[data$z==6]<-'C'
data$Class[data$z==7]<-'D'
data$Class[data$z==8]<-'D'
data$Class[data$z==9]<-'E'
data$Class[data$z==10]<-'E'
str(data)

当我用它绘图时

colors=c("red","green","blue","cyan","magenta","yellow")
cloud(data$z ~ data$x + data$y, xlab="X", ylab="Y", zlab="Z",main="All Classes",
col.point = colors[data$Class])

我得到下面的情节 . 所有积分均为蓝色 .

enter image description here

1 回答

  • 0

    JeremyCG发现了这个问题 . 以下是完整的代码,供将来参考 .

    library(lattice)
    num <- 10
    data <- as.data.frame(
    cbind(
      x=rep(seq(1,num), each=num*num), 
      y=rep(seq(1,num), each=num), 
      z=rep(seq(1,num)) 
    ))
    data$Class[data$z==1]<-'A'
    data$Class[data$z==2]<-'A'
    data$Class[data$z==3]<-'B'
    data$Class[data$z==4]<-'B'
    data$Class[data$z==5]<-'C'
    data$Class[data$z==6]<-'C'
    data$Class[data$z==7]<-'D'
    data$Class[data$z==8]<-'D'
    data$Class[data$z==9]<-'E'
    data$Class[data$z==10]<-'E'
    str(data)
    

    这显示了这个问题:

    ## 'data.frame':    1000 obs. of  4 variables:
    ##  $ x    : int  1 1 1 1 1 1 1 1 1 1 ...
    ##  $ y    : int  1 1 1 1 1 1 1 1 1 1 ...
    ##  $ z    : int  1 2 3 4 5 6 7 8 9 10 ...
    ##  $ Class: chr  "A" "A" "B" "B" ...
    

    等级必须是一个因素 . 这解决了它:

    data$Class <- as.factor(data$Class)
    str(data)
    
    ## 'data.frame':    1000 obs. of  4 variables:
    ##  $ x    : int  1 1 1 1 1 1 1 1 1 1 ...
    ##  $ y    : int  1 1 1 1 1 1 1 1 1 1 ...
    ##  $ z    : int  1 2 3 4 5 6 7 8 9 10 ...
    ##  $ Class: Factor w/ 5 levels "A","B","C","D",..: 1 1 2 2 3 3 4 4 5 5 ...
    

    然后绘制它:

    colors=c("red","green","blue","cyan","magenta","yellow")
    cloud(data$z ~ data$x + data$y, xlab="X", ylab="Y", zlab="Z",
    pch=20,main="All Classes",col = colors[data$Class])
    

    结果如下:

    Works!

    谢谢@jeremycg!

相关问题