2017-09-08 5 views
0

Je voudrais voir la densité de mes données afin que je dessine un tracé de contour en utilisant les données pré-traitées par la fonction cut, ceci est un petit échantillon de mes données:Valeurs x et y-axis incorrectes de plot2D

> 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 

J'utilise la bibliothèque plot3D et,

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

C'est ce que je suis:

enter image description here

Vous pouvez voir que les valeurs de l'axe des x et de l'axe des y sont incorrectes, même pas près du milieu des intervalles. Est-ce que quelqu'un sait comment corriger cela?

Répondre

0

La fonction contour2D() met à l'échelle les axes compris entre 0 et 1 par défaut. Pour obtenir différents axes, vous pouvez omettre les axes de l'appel contour2D() original et les ajouter en utilisant axis() avec at et labels spécifié. Si vous utilisez le factors de cut(), vous devrez les convertir en valeurs numériques avant de tracer. J'ai fourni un exemple ci-dessous où je génère des données, les tracer, puis ajuster les étiquettes des axes après la conversion des facteurs en valeurs numériques. Sans votre format de données exact, je ne connais pas le meilleur moyen d'extraire des étiquettes de marques de vos données.

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

I réussi à omettre les axes de contour2D mais quand j'ajoutant de l'axe x par> axe (côté = 1, à la SEQ = (0,1, length.out = 9), les étiquettes = round (pc2_cut, 2)), j'ai cette erreur: Erreur dans Math.factor (c (10L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L,: 'rond' non significatif pour les facteurs Savez-vous pourquoi? Merci! – HYY

+0

@HYY, cochez 'class (pc_cut)' .Si c'est un "caractère" ', alors' R' le traite comme une chaîne de caractères. les emplacements de 'cut()', et vous pouvez ensuite les utiliser dans l'argument 'labels' avec round.Si vous ne voulez pas faire cela, vous devrez probablement utiliser' substr() 'pour prendre la partie number, et alors 'as.nu meric() 'pour en faire une valeur qui peut être arrondie. Vous pouvez également utiliser 'substr()' si vous ne voulez pas arrondir car les étiquettes peuvent être des chaînes. –

+0

J'ai vérifié, c'est un facteur. – HYY