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")
这是我得到:
您可以看到x轴和y轴值不正确,甚至不在间隔的中点附近。有谁知道如何解决这个问题?
答
contour2D()
函数默认情况下将轴缩放到0和1之间。要获得不同的轴,您可以省略原始contour2D()
呼叫的轴,并使用axis()
与at
和labels
指定的值来添加轴。如果您使用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
)
我设法省去从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
@HYY,检查'class(pc_cut)'。如果它是一个''字符'',那么'R'就把它当作一个字符串来处理。 (')'的位置,然后你可以在'labels'参数中使用这些参数,如果你不想这样做,你可能不得不使用'substr()'来获取数字部分,并且那么'as.nu meric()'使它成为一个可以四舍五入的值。如果不想舍入,可以使用'substr()',因为标签可以是字符串。 –
我查过了,这是因素。 – HYY