contour2D plot的x和y轴值不正确

问题描述:

我希望看到我的数据密度,所以我使用cut函数预处理的数据绘制了等高线图,这是我的数据的一个小样本:contour2D plot的x和y轴值不正确

> 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轴值不正确,甚至不在间隔的中点附近。有谁知道如何解决这个问题?

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

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 

) 
+0

我设法省去从contour2D轴但是当我由>轴(添加x轴侧= 1,在= SEQ(0,1,length.out = 9),标签= round(pc2_cut,2)),我得到这个错误:Math.factor中出错(c(10L,9L,10L,10L,10L,10L,10L,10L,11L,11L,'round')对于因素没有意义。你知道为什么吗?谢谢! – HYY

+0

@HYY,检查'class(pc_cut)'。如果它是一个''字符'',那么'R'就把它当作一个字符串来处理。 (')'的位置,然后你可以在'labels'参数中使用这些参数,如果你不想这样做,你可能不得不使用'substr()'来获取数字部分,并且那么'as.nu meric()'使它成为一个可以四舍五入的值。如果不想舍入,可以使用'substr()',因为标签可以是字符串。 –

+0

我查过了,这是因素。 – HYY