Question

J'ai posé la question sur le stockage d'un tracé hier dans un objet. J'ai essayé de mettre en œuvre la première approche (sachant que je n'avais pas précisé que j'utilisais qplot () dans ma question initiale) et j'ai constaté que cela ne fonctionnait pas comme prévu.

library(ggplot2)               # add ggplot2

string = "C:/example.pdf"      # Setup pdf
pdf(string,height=6,width=9)

x_range <- range(1,50)         # Specify Range

# Create a list to hold the plot objects.
pltList <- list()
pltList[]

for(i in 1 : 16){

# Organise data 
y = (1:50) * i * 1000                       # Get y col
x = (1:50)                                  # get x col
y = log(y)                                  # Use natural log

# Regression
lm.0 = lm(formula = y ~ x)                  # make linear model
inter = summary(lm.0)$coefficients[1,1]     # Get intercept
slop = summary(lm.0)$coefficients[2,1]      # Get slope

# Make plot name
pltName <- paste( 'a', i, sep = '' )

# make plot object    
p <- qplot(
    x, y,   
    xlab = "Radius [km]", 
    ylab = "Services [log]",
    xlim = x_range,
    main = paste("Sample",i)
) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)        

print(p)     

pltList[[pltName]] = p       
}

# close the PDF file
dev.off() 

Dans ce cas, j'ai utilisé des numéros d'échantillons pour que le code s'exécute s'il est simplement copié. J'ai passé quelques heures à réfléchir, mais je n'arrive pas à comprendre ce qui ne va pas. Il écrit le premier ensemble de fichiers PDF sans problème, donc j'ai 16 fichiers PDF avec les tracés corrects.

Puis, quand j'utilise ce morceau de code:

string = "C:/test_tabloid.pdf"
pdf(string, height = 11, width = 17)

grid.newpage()
pushViewport( viewport( layout = grid.layout(3, 3) ) )

vplayout <- function(x, y){viewport(layout.pos.row = x, layout.pos.col = y)}

counter = 1

# Page 1
for (i in 1:3){    
    for (j in 1:3){     
         pltName <- paste( 'a', counter, sep = '' )   
         print( pltList[[pltName]], vp = vplayout(i,j) )
         counter = counter + 1
     }
 }

 dev.off()

le résultat obtenu est la dernière ligne du modèle linéaire ( abline ) de chaque graphique, mais les données ne changent pas. Lorsque je vérifie ma liste de parcelles, il semble que toutes les parcelles soient écrasées par la parcelle la plus récente (à l'exception de l'objet abline ).

Une question secondaire de moindre importance était de savoir comment générer un pdf multi-page avec plusieurs parcelles sur chaque page, mais l'objectif principal de mon code était de stocker les parcelles dans une liste à laquelle je pourrais accéder ultérieurement.

Était-ce utile?

La solution

Ok, donc si votre commande de tracé est modifiée en

p <- qplot(data = data.frame(x = x, y = y),
           x, y,   
           xlab = "Radius [km]", 
           ylab = "Services [log]",
           xlim = x_range,
           ylim = c(0,10),
           main = paste("Sample",i)
           ) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)           

alors tout fonctionne comme prévu. Voici ce que je soupçonne de se produire (même si Hadley pourrait probablement clarifier les choses). Lorsque ggplot2 " enregistre " les données, ce qu’elles font réellement est de sauvegarder un cadre de données et les noms des paramètres. Donc, pour la commande telle que je l’ai donnée, vous obtenez

> summary(pltList[["a1"]])
data: x, y [50x2]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

Cependant, si vous ne spécifiez pas de paramètre data dans qplot, toutes les variables sont évaluées dans la portée actuelle, car il n'y a pas de cadre de données attaché (lu: enregistré).

data: [0x0]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

Ainsi, lorsque le tracé est généré pour la deuxième fois, plutôt que d'utiliser les valeurs d'origine, il utilise les valeurs actuelles de x et de y .

Autres conseils

Je pense que vous devriez utiliser l'argument data dans qplot , c'est-à-dire stocker vos vecteurs dans un bloc de données.

Voir le livre de Hadley, section 4.4:

La restriction sur les données est simple: il doit s'agir d'une trame de données. Ceci est restrictif et contrairement aux autres progiciels graphiques de R. Les fonctions de réseau peuvent prendre un cadre de données facultatif ou utiliser des vecteurs directement à partir de l'environnement global. ...

Les données sont stockées dans l'objet tracé sous forme de copie et non de référence. Cela a deux conséquences importantes: si vos données changent, l'intrigue ne le fera pas; Les objets et ggplot2 sont entièrement autonomes, de sorte qu’ils peuvent être save () d sur un disque puis chargés () et complotés sans avoir besoin de rien d’autre de cette session.

Votre code contient un bogue concernant l’inscription de liste. Il devrait être

pltList[[pltName]]

pas

pltList[pltName]

Remarque:

class(pltList[1])
[1] "list"

pltList [1] est une liste contenant le premier élément de pltList.

class(pltList[[1]])
[1] "ggplot"

pltList [[1]] est le premier élément de pltList.

Pour votre deuxième question: les fichiers PDF multi-pages sont faciles - voir aide (pdf) :

 onefile: logical: if true (the default) allow multiple figures in one
          file.  If false, generate a file with name containing the
          page number for each page.  Defaults to ‘TRUE’.

En ce qui concerne votre question principale, je ne comprends pas si vous souhaitez stocker les entrées de tracé dans une liste pour un traitement ultérieur, ou les sorties de tracé . Si c'est le dernier cas, je ne suis pas sûr que plot () retourne un objet que vous pouvez stocker et récupérer.

Une autre suggestion concernant votre deuxième question serait d’utiliser soit Sweave, soit Brew, car elles vous donneront un contrôle total sur la façon dont vous affichez votre fichier PDF multipage.

Découvrez cette question connexe .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top