Pergunta

Eu perguntei este pergunta ontem sobre o armazenamento de um terreno dentro de um objeto.Eu tentei implementar a primeira abordagem (atenção que eu não especificou que eu estava usando qplot() na minha pergunta original) e notei que ele não funcionar conforme o esperado.

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() 

Eu tenho usado o exemplo de números, neste caso, o código é executado se é apenas copiado.Eu passei algumas horas filosofar sobre isso, mas eu não posso descobrir o que está errado.Ele grava o primeiro conjunto de pdfs sem problema, então eu tenho 16 pdfs com o correto parcelas.

Então, quando eu usar esse pedaço de código:

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()

o resultado é o último modelo linear (linha deabline) em cada gráfico, mas os dados não se alteram.Quando eu verificar minha lista de parcelas, parece que todos eles se tornam substituído pelo mais recente enredo (com exceção do abline objeto).

Menos importante secundário questão de como gerar um muli-página pdf com várias parcelas em cada página, mas a principal meta do meu código foi para armazenar as parcelas em uma lista que eu poderia acessar posteriormente.

Foi útil?

Solução

Ok, então, se o seu comando gráfico é alterado para

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)           

em seguida, tudo funciona conforme o esperado.Aqui está o que eu suspeito que está acontecendo (embora Ela provavelmente poderia esclarecer as coisas).Quando ggplot2 "salva" os dados, o que ele realmente faz é guardar um quadro de dados, e os nomes dos parâmetros.Assim, para o comando-lo tenho dado, você obter

> 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)

No entanto, se você não especificar um data parâmetro em qplot, todas as variáveis, sejam avaliados no escopo atual, porque não há nenhum anexo (leia:salvo) quadro de dados.

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)

Assim, quando o enredo é gerado a segunda vez, em vez de utilizar os valores originais, ele usa o atual valores de x e y.

Outras dicas

Eu acho que você deveria usar o data argumento em qplot, ou seja, armazene seus vetores em um quadro de dados.

Veja o livro de Hadley, Seção 4.4:

A restrição dos dados é simples: deve ser um quadro de dados. Isso é restritivo e, diferentemente de outros pacotes de gráficos nas funções de R. Lattice, podem pegar um quadro de dados opcionais ou usar vetores diretamente do ambiente global. ...

Os dados são armazenados no objeto da plotagem como uma cópia, não uma referência. Isso tem duas consequências importantes: se seus dados mudarem, o gráfico não; e os objetos GGPlot2 são totalmente independentes, para que possam ser salvados () d em disco e carregar posteriormente () e ed e plotados sem precisar de mais nada dessa sessão.

Há um bug no seu código referente à assinatura da lista. Deveria ser

pltList[[pltName]]

não

pltList[pltName]

Observação:

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

pLtlist [1] é um Lista contendo o primeiro elemento do pltlist.

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

pLtlist [[1]] é o primeiro elemento de pltlist.

Para sua segunda pergunta: os PDFs de várias páginas são fáceis-veja help(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’.

Para sua pergunta principal, não entendo se você deseja armazenar o entradas de plotagem em uma lista para processamento posterior, ou o saídas da plotagem. Se for o último, não tenho certeza de que plot() Retorna um objeto que você pode armazenar e recuperar.

Outra sugestão sobre sua segunda pergunta seria usar o Sweave ou Brew, pois eles fornecerão controle completo sobre como você exibir seu PDF de várias páginas.

Dar uma olhada Nesta pergunta relacionada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top