contour2D 图的 x 和 y 轴值不正确

Incorrect x and y-axis values of contour2D plot

我想看看我的数据的密度,所以我用 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")

这是我得到的:

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

contour2D() 函数默认在 0 和 1 之间缩放轴。要获得不同的轴,您可以省略原始 contour2D() 调用中的轴,并使用 axis() 添加它们并指定 atlabels。如果您使用 cut() 中的 factors,您必须在绘图前将它们转换为数值。我在下面提供了一个示例,我在其中生成数据、绘制数据,然后在将因子转换为数值后调整轴标签。如果没有您的确切数据格式,我不知道从您的数据中提取刻度标记标签的最佳方法。

# 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

)