Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre Gabriel
Messages : 8
Enregistré le : 24 Avr 2018, 12:45

Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Pierre Gabriel » 24 Avr 2018, 13:24

Bonjour,

Suite à notre script R nous obtenons le message d'erreur suivant :

Code : Tout sélectionner

Error in plot.window(...) : valeurs finies requises pour 'ylim'


Notre script :

Code : Tout sélectionner

getwd()
setwd('P:/Priv/Arnaud/ACM_stageM2EE/Manips/manip1/results/Interaction_plots')

windowsFonts(A=windowsFont("Calibri"))

vec = c("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai")

for(i in 1:length(vec)) {
  for(j in 0:length(vec)) {
   
    tiff(paste("./FIGURE_interaction_plot_", vec[i] , vec[i+j] , ".tiff" , sep=""), res=300, width=7, height=15, unit="in", compression="lzw")
    m = matrix(1:4, 2, 2)
    layout(m, widths=c(3,10), heights=c(10,1.5))
    layout.show(4)
    par(mar=c(0,0,0,0), ps=8)
    plot(0, 0, xlim=c(0,0.1), ylim=c(0,1), type="n", axes=FALSE, frame.plot=FALSE)
    text(0.03, 0.5, paste("aboveground biomass - A. thaliana (mg)", sep=""), srt=90, cex=4.5, family="A", font= 2)
    par(mar=c(0,0,0,0), ps=8)
    plot(0, 0, xlim=c(0,0.1), ylim=c(0,1), type="n", axes=FALSE, frame.plot=FALSE)
   
    setwd('P:/Priv/Arnaud/ACM_stageM2EE/Manips/manip1/datas')
    data = read.table("interaction_plot.txt", dec=".", na.strings=".", header=TRUE)
    setwd('P:/Priv/Arnaud/ACM_stageM2EE/Manips/manip1/results/Interaction_plots')
   
    data = data[data$treatment==vec[i] | data$treatment==vec[i+j],]
    data$color = "black"
    colnames(data) = c("accession","position","treatment","BLUP","color")
    plot(0, 0, xlim=c(0.9,2.2), ylim=c(min(data$BLUP)-0.1*min(data$BLUP), max(data$BLUP)+0.1*max(data$BLUP)), axes=F, xlab="", ylab="Disease index", type="n", frame.plot=F, cex.main=1, cex.lab=1)
    axis(side=2, cex.axis=4.5)
    axis(1, at=c(1:2), labels = c(vec[i],vec[i+j]), cex.axis=4.5, font = 2, mgp=c(4,3,0))
    number=0
   
    for (ind in sort(levels(data$accession))) {
      number=number+1
      Z=data[data$accession==ind,]
      point1=Z[Z$treatment==vec[i],4]
      point2=Z[Z$treatment==vec[i+j],4]
     
      vectpoint=c(point1, point2)
      if (!any(is.na(vectpoint)==TRUE)) {
        lines(x= c(1:2), y = vectpoint, type="b", col=data$color[data$accession==ind][1], cex=1)
      }
    }
    dev.off()
  }
}



Ce que nous cherchons à faire :

Nous voulons faire une trentaine d'interaction plots (d'où les boucles en début de script) en les enregistrant directement dans des fichiers au format TIFF. Nous avons un jeu de données avec 8 sous-jeux de données ("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai"), et nous voulons faire des interaction plots entre chacun de ces 8 sous-jeux de données (Ma avec Mb, Ma avec Mm, Ma avec Ta,.......Tl avec Ai).

Quand nous lançons le script, on voit en direct les fichiers TIFF se faire correctement mais seulement pour les MAXx (MaMb, MaMm, MaTa, MaTg, MaTd, MaTl). Une fois que tout les MAXx sont faits, le script se stop avec le message d'erreur indiqué.

L'erreur semble provenir des valeurs de ylim du plot. Pour adapter la taille du plot à nos données, nous ne mettons pas des valeurs fixes mais des valeurs dépendantes des minima et maxima de nos données : ylim=c(min(data$BLUP)-0.1*min(data$BLUP), max(data$BLUP)+0.1*max(data$BLUP)).

Ce que nous ne comprenons pas, c'est pourquoi le script marche pour la première valeur de [i] (à savoir Ma) mais que ça ne marche plus pour les autres ?

Si nous choisissons 5 et 20 respectiment en limites mini et maxi, le script marchera correctement du début jusqu'à la fin, mais comme expliqué plus haut, nous voudrions que les limites min et max varient avec les sous-jeu de données utilisées.


Nous avons une seconde question, plus minime mais temps qu'on y est pourquoi pas :
ce script nous permet de faire toutes les combinaisons d'interaction plot entre "Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai". Certaines combinaisons sont inutiles : MaMa, MbMb, MmMm, TaTa, TdTd, TgTg, TlTl, et AiAi. Aussi, ce script crée des fichiers TIFF pour MaNA, MbNA, MmNA, TaNA, TdNA, TgNA, TlNA, et AiNA, qui ne donnent rien, d'où sortent ces NA ? Notre seconde question très minime est donc : pouvons-nous optimiser notre script pour ne pas avoir ni les combinaisons inutiles ni les combinaisons avec NA ?


Merci d'avance pour votre aide.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Serge Rapenne » 24 Avr 2018, 14:59

Bonjour,

une 1ere remarque :

Code : Tout sélectionner

for(i in 1:length(vec)) {
  for(j in 0:length(vec))
  tiff(paste("./FIGURE_interaction_plot_", vec[i] , vec[i+j] , ".tiff" , sep=""), res=300, width=7, height=15, unit="in", compression="lzw")   

quand pour un i donnée, j vaut length(vec) il y un pb pour vec[i+j] qui va avoir la même valeur que pour pour i+1 et j=0 et qui n'est pas défini pour j=length(vec).

Code : Tout sélectionner

for(j in 0:(length(vec)-1))
devrait être mieux

Serge

Edit. Je pense que la plantage vient d’ailleurs de là :

Code : Tout sélectionner

data = data[data$treatment==vec[i] | data$treatment==vec[i+j],]

quand i=j=length(vec), je ne sais ps trop ce que vaux data

Pierre Gabriel
Messages : 8
Enregistré le : 24 Avr 2018, 12:45

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Pierre Gabriel » 24 Avr 2018, 15:30

en mettant ça :
Serge Rapenne a écrit :

Code : Tout sélectionner

for(j in 0:(length(vec)-1))

à la place de :

Code : Tout sélectionner

for(j in 0:length(vec)) {

le script effectue désormais pas seulement les figures MaXx mais aussi les MbXx (c'est déja un petit progès), puis bloque de la même manière en me disant :

Code : Tout sélectionner

Error in plot.window(...) : valeurs finies requises pour 'ylim'

Je note aussi que le script ne me produit plus la figure MaNA, par contre il produit la figure MbNA.
Si je remplace mes ylim par des valeurs précises telles que 5 et 20, le résultat final est le même qu'avec le code initial (à part qu'il ne fait plus le graphe MaNA).

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Serge Rapenne » 24 Avr 2018, 15:36

ajoute

Code : Tout sélectionner

print(paste("i=",i,"j=",j))

dans les boucles pour voir pour quels valeurs de i et j ça plante

Serge

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Serge Rapenne » 24 Avr 2018, 15:44

C'est dure en fin de journée, ton code ne peut effectivement pas fonctionner
essaye le code suivant

Code : Tout sélectionner

vec = c("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai")

for (i in 1:length(vec)){
  for (j in 0:(length(vec)-1)){
    print(paste("i=",i,"j=",j,"vec[i]=",vec[i],"vec[i+j]=",vec[i+j]))
  }
}


la logique même de cette double boucle est fausse

Serge

Pierre Gabriel
Messages : 8
Enregistré le : 24 Avr 2018, 12:45

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Pierre Gabriel » 24 Avr 2018, 15:49

Code : Tout sélectionner

> vec = c("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai")
> for (i in 1:length(vec)){
+   for (j in 0:(length(vec)-1)){
+     print(paste("i=",i,"j=",j,"vec[i]=",vec[i],"vec[i+j]=",vec[i+j]))
+   }
+ }
[1] "i= 1 j= 0 vec[i]= Ma vec[i+j]= Ma"
[1] "i= 1 j= 1 vec[i]= Ma vec[i+j]= Mb"
[1] "i= 1 j= 2 vec[i]= Ma vec[i+j]= Mm"
[1] "i= 1 j= 3 vec[i]= Ma vec[i+j]= Ta"
[1] "i= 1 j= 4 vec[i]= Ma vec[i+j]= Td"
[1] "i= 1 j= 5 vec[i]= Ma vec[i+j]= Tg"
[1] "i= 1 j= 6 vec[i]= Ma vec[i+j]= Tl"
[1] "i= 1 j= 7 vec[i]= Ma vec[i+j]= Ai"
[1] "i= 2 j= 0 vec[i]= Mb vec[i+j]= Mb"
[1] "i= 2 j= 1 vec[i]= Mb vec[i+j]= Mm"
[1] "i= 2 j= 2 vec[i]= Mb vec[i+j]= Ta"
[1] "i= 2 j= 3 vec[i]= Mb vec[i+j]= Td"
[1] "i= 2 j= 4 vec[i]= Mb vec[i+j]= Tg"
[1] "i= 2 j= 5 vec[i]= Mb vec[i+j]= Tl"
[1] "i= 2 j= 6 vec[i]= Mb vec[i+j]= Ai"
[1] "i= 2 j= 7 vec[i]= Mb vec[i+j]= NA"
[1] "i= 3 j= 0 vec[i]= Mm vec[i+j]= Mm"
[1] "i= 3 j= 1 vec[i]= Mm vec[i+j]= Ta"
[1] "i= 3 j= 2 vec[i]= Mm vec[i+j]= Td"
[1] "i= 3 j= 3 vec[i]= Mm vec[i+j]= Tg"
[1] "i= 3 j= 4 vec[i]= Mm vec[i+j]= Tl"
[1] "i= 3 j= 5 vec[i]= Mm vec[i+j]= Ai"
[1] "i= 3 j= 6 vec[i]= Mm vec[i+j]= NA"
[1] "i= 3 j= 7 vec[i]= Mm vec[i+j]= NA"
[1] "i= 4 j= 0 vec[i]= Ta vec[i+j]= Ta"
[1] "i= 4 j= 1 vec[i]= Ta vec[i+j]= Td"
[1] "i= 4 j= 2 vec[i]= Ta vec[i+j]= Tg"
[1] "i= 4 j= 3 vec[i]= Ta vec[i+j]= Tl"
[1] "i= 4 j= 4 vec[i]= Ta vec[i+j]= Ai"
[1] "i= 4 j= 5 vec[i]= Ta vec[i+j]= NA"
[1] "i= 4 j= 6 vec[i]= Ta vec[i+j]= NA"
[1] "i= 4 j= 7 vec[i]= Ta vec[i+j]= NA"
[1] "i= 5 j= 0 vec[i]= Td vec[i+j]= Td"
[1] "i= 5 j= 1 vec[i]= Td vec[i+j]= Tg"
[1] "i= 5 j= 2 vec[i]= Td vec[i+j]= Tl"
[1] "i= 5 j= 3 vec[i]= Td vec[i+j]= Ai"
[1] "i= 5 j= 4 vec[i]= Td vec[i+j]= NA"
[1] "i= 5 j= 5 vec[i]= Td vec[i+j]= NA"
[1] "i= 5 j= 6 vec[i]= Td vec[i+j]= NA"
[1] "i= 5 j= 7 vec[i]= Td vec[i+j]= NA"
[1] "i= 6 j= 0 vec[i]= Tg vec[i+j]= Tg"
[1] "i= 6 j= 1 vec[i]= Tg vec[i+j]= Tl"
[1] "i= 6 j= 2 vec[i]= Tg vec[i+j]= Ai"
[1] "i= 6 j= 3 vec[i]= Tg vec[i+j]= NA"
[1] "i= 6 j= 4 vec[i]= Tg vec[i+j]= NA"
[1] "i= 6 j= 5 vec[i]= Tg vec[i+j]= NA"
[1] "i= 6 j= 6 vec[i]= Tg vec[i+j]= NA"
[1] "i= 6 j= 7 vec[i]= Tg vec[i+j]= NA"
[1] "i= 7 j= 0 vec[i]= Tl vec[i+j]= Tl"
[1] "i= 7 j= 1 vec[i]= Tl vec[i+j]= Ai"
[1] "i= 7 j= 2 vec[i]= Tl vec[i+j]= NA"
[1] "i= 7 j= 3 vec[i]= Tl vec[i+j]= NA"
[1] "i= 7 j= 4 vec[i]= Tl vec[i+j]= NA"
[1] "i= 7 j= 5 vec[i]= Tl vec[i+j]= NA"
[1] "i= 7 j= 6 vec[i]= Tl vec[i+j]= NA"
[1] "i= 7 j= 7 vec[i]= Tl vec[i+j]= NA"
[1] "i= 8 j= 0 vec[i]= Ai vec[i+j]= Ai"
[1] "i= 8 j= 1 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 2 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 3 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 4 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 5 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 6 vec[i]= Ai vec[i+j]= NA"
[1] "i= 8 j= 7 vec[i]= Ai vec[i+j]= NA"
>

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Serge Rapenne » 24 Avr 2018, 16:34

Ce que je voulais dire c'est regarde le resulktat du code que j'ai fourni tu comprendra pourquoi le tiens ne peut pas fonctionner

Serge

Pierre Gabriel
Messages : 8
Enregistré le : 24 Avr 2018, 12:45

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Pierre Gabriel » 24 Avr 2018, 16:54

En fait je suis assez débutant, je veux bien qu'on me prenne par la main un tout petit peu plus parce-que je n'arrive pas à trouver / comprendre le problème =(

Je suis vraiment mauvais, la plupart du code ne vient pas de moi, j'ai pris petits bouts par petits bouts par-ci par-là. En fait je n'ai jamais fais de boucles et celles-ci m'ont été recommandées par des amis mais je ne suis pas capable de les comprendre (en particulier le "i+j").

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Bastien Gamboa » 25 Avr 2018, 07:16

Bonjour,

Je n'ai pas lu en détail ton script (qui n'est ni minimal ni reproductible en passant), mais si je comprend bien tu souhaites boucler sur 'vec' pour produire tous les couples 2 à 2. Voici une approche :

Code : Tout sélectionner

vec <- c("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai") # ton vecteur
vec2 <- data.frame(X1=rep(vec, each=length(vec)), X2=rep(vec, times=length(vec))) # toutes les combinaisons possible
vec2 <- t(combn(vec, 2)) # Toutes les combinaisons possible, sans répétitions ('MaMb' présent, mais pas 'MbMa' par exemple)

for(i in 1:nrow(vec2)) {
  ### Ne pas produire le script pour les interactions que tu ne veux pas
  # 1re approche
  if(paste0(vec2[i,1], vec2[i,2])%in%c("MaMa", "MbMb", "MmMm", "TaTa", "TdTd", "TgTg", "TlTl", "AiAi")) next
 
  # 2è approche (inutile si vec2 construit avec combn())
  if(vec2[i,1]==vec2[i,2]) next
 
  ### Tiff
  tiff(filename=paste0("./FIGURE_interaction_plot_", vec2[i,1], vec2[i,2], ".tiff"), ...)
  ...
}

Pour ton problème de ylim, il se peut que tu ais des 'NA' et/ou des 'Inf' dans tes données. Tu peux le vérifier avec :

Code : Tout sélectionner

sum(is.na(donnees))
sum(is.infinite(donnees))
Si c'est des NA, et que leur présence n'impacte pas tes données (à vérifier avant l'étape des graphes) alors dans les fonctions min() et max() ajoute l'argument na.rm=TRUE. Si c'est des '+Inf' ou '-Inf' tu dois les remplacer avant l'étape du graphe.

HTH,
Bastien

Pierre Gabriel
Messages : 8
Enregistré le : 24 Avr 2018, 12:45

Re: Erreur dans une double boucle : Error in plot.window(...) : valeurs finies requises pour 'ylim'

Messagepar Pierre Gabriel » 25 Avr 2018, 08:13

Bastien Gamboa a écrit :

Code : Tout sélectionner

vec <- c("Ma", "Mb", "Mm", "Ta", "Td", "Tg", "Tl", "Ai")
vec2 <- data.frame(X1=rep(vec, each=length(vec)), X2=rep(vec, times=length(vec)))
vec2 <- t(combn(vec, 2))

for(i in 1:nrow(vec2)) {
  if(paste0(vec2[i,1], vec2[i,2])%in%c("MaMa", "MbMb", "MmMm", "TaTa", "TdTd", "TgTg", "TlTl", "AiAi")) next


Ça m'a tout corrigé ! Merci beaucoup pour votre aide à tous !

Si je comprends un minimum, le problème de ylim venait bien de NA, mais des NA ne provenant non pas de mon jeu de données initial mais des NA créés par des mauvaises boucles (sans doute ce que Serge a voulu me dire mais je ne comprenais pas).

Encore merci, bonne journée !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité