代码之家  ›  专栏  ›  技术社区  ›  HYY

contour2D绘图的x轴和y轴值不正确

  •  0
  • HYY  · 技术社区  · 8 年前

    cut 函数,这是我的数据的一个小样本:

    > z[1:2,]
               pc2_cut
    pc1_cut         (-1.61,-1.45] (-1.45,-1.3] (-1.3,-1.15] (-1.15,-1] (-1,-0.851]
    (-1.58,-1.38]             0            1            1          0           0
    (-1.38,-1.18]             5            1            4          1           0
    

    plot3D

    > contour2D(z,border="black",xlab="PC1",ylab="PC2")
    

    这就是我得到的:

    enter image description here

    您可以看到x轴和y轴值不正确,甚至不在间隔中点附近。有人知道如何纠正这个问题吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Calvin    8 年前

    这个 contour2D() contour2D() axis() 具有 at labels factors cut() 在打印之前,必须将其转换为数值。我在下面提供了一个示例,其中我生成数据,绘制数据,然后在将因子转换为数值后调整轴标签。如果没有精确的数据格式,我不知道从数据中提取刻度线标签的最佳方法。

    enter image description here

    # library for plot
    library(plot3D)
    
    # setting seed and generating some data
    set.seed(10)
    
    #### storing data in matrix ####
    datamatrix <- matrix(c(rnorm(500,-1,.4),rnorm(500,2,0.2),runif(500,-3,0),runif(500,0,3)),nrow=1000,ncol=2,byrow=F)
    
    # locations of cuts
    xcuts <- seq(min(datamatrix[,1]),max(datamatrix[,1]),length.out = 6)
    ycuts <- seq(min(datamatrix[,2]),max(datamatrix[,2]),length.out = 6)
    
    # calculating values for cutting
    xvals <- cut(datamatrix[,1], xcuts)
    yvals <- cut(datamatrix[,2], ycuts)
    
    # initializing matrix to store count in each bin
    z <- matrix(0,length(levels(yvals)),length(levels(xvals)))
    
    for(i in 1:length(levels(xvals))){
      for(j in 1:length(levels(yvals))){
        z[j,i] <- length(intersect(which(xvals == levels(xvals)[i]),which(yvals == levels(yvals)[j])))
      }
    }
    
    #### finding labels from factors cut ####
    factsx <- levels(xvals) # factsx <- levels_pc2_cut # or something like that
    xlabsFacts <- rep(NA,length(factsx))
    
    for(i in 1:(length(factsx))){
    
      comma_sep <- unlist(gregexpr(pattern =',',factsx[i])) # location of the comma in the factor
    
      #taking section of text and converting to numbers
      xlabsFacts[i] <- as.numeric(substr(factsx[i],2,comma_sep-1))
      xlabsFacts[i+1] <- as.numeric(substr(factsx[i],comma_sep+1,nchar(factsx[i])-1))
    
    }
    
    factsy <- levels(yvals) # factsy <- levels_pc1_cut # or something like that
    ylabsFacts <- rep(NA,length(factsy))
    
    for(i in 1:(length(factsy))){
    
      comma_sep <- unlist(gregexpr(pattern =',',factsy[i])) # location of the comma in the factor
    
      #taking section of text and converting to numbers
      ylabsFacts[i] <- as.numeric(substr(factsy[i],2,comma_sep-1)) 
      ylabsFacts[i+1] <- as.numeric(substr(factsy[i],comma_sep+1,nchar(factsy[i])-1))
    
    }
    
    
    #### formatting plot ####
    # contour plot without axes
    contour2D(z
              ,yaxt='n' # no y axis ticks
              ,xaxt='n' # no x axis ticks
              ,ylab='y values' # y axis label
              ,xlab='x values' # x axis label
    )
    
    # adding x axis with tick marks
    axis(side=1 # bottom
         ,at=seq(0,1,length.out = length(xlabsFacts)) # change 6 to number of tick marks you want
         ,labels=round(xlabsFacts,2) # change to labels for tick marks from your data
    )
    
    # adding x axis with tick marks
    axis(side=2 # bottom
         ,at=seq(0,1,length.out = length(ylabsFacts)) # change 6 to number of tick marks you want
         ,labels=round(ylabsFacts,2) # change to labels for tick marks from your data
    
    )
    
    推荐文章