문제

나는 물었다 이것 어제 물체 안에 음모를 저장하는 것에 대해 의문을 제기하십시오. 첫 번째 접근 방식을 구현하려고 시도했습니다 (내가 사용하고 있음을 명시하지 않았다는 것을 알았습니다. qplot() 나의 원래 질문에서) 그리고 그것이 예상대로 작동하지 않는다는 것을 알아 차렸다.

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

이 경우 샘플 번호를 사용하여 코드가 복사 된 경우 코드가 실행됩니다. 나는 이것에 대해 몇 시간을 퍼즐로 보냈지 만 무엇이 잘못되고 있는지 알 수는 없습니다. 문제없이 첫 번째 PDF 세트를 작성하므로 올바른 플롯이있는 16 개의 PDF가 있습니다.

그런 다음이 코드를 사용하면 다음과 같습니다.

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

내가 얻는 결과는 마지막 선형 모델 라인입니다 (abline) 모든 그래프에서 데이터는 변경되지 않습니다. 내 음모 목록을 확인할 때, 가장 최근의 음모에 의해 모든 것이 덮어 쓰는 것 같습니다 (제외) abline 물체).

덜 중요한 두 번째 질문은 각 페이지에 여러 플롯이있는 Muli-Page PDF를 생성하는 방법이었습니다. 그러나 내 코드의 주요 목표는 나중에 액세스 할 수있는 목록에 플롯을 저장하는 것이 었습니다.

도움이 되었습니까?

해결책

좋아, 그래서 당신의 플롯 명령이 변경되면

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)           

그런 다음 모든 것이 예상대로 작동합니다. 내가 의심되는 일은 다음과 같습니다 (Hadley는 아마도 일을 명확히 할 수 있지만). GGPLOT2가 데이터를 "저장"하면 실제로 수행하는 것은 데이터 프레임과 매개 변수 이름을 저장하는 것입니다. 그래서 내가 준 명령을 위해

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

그러나 a를 지정하지 않는 경우 data qplot의 매개 변수는 첨부 된 (읽기 : 저장된) 데이터 프레임이 없기 때문에 모든 변수가 현재 범위에서 평가됩니다.

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)

따라서 플롯이 원래 값을 사용하지 않고 두 번째로 생성되면 현재의 의 가치 x 그리고 y.

다른 팁

나는 당신이 사용해야한다고 생각합니다 data 인수 qplot, 즉, 벡터를 데이터 프레임에 보관하십시오.

Hadley 's Book, 4.4 절 참조 :

데이터의 제한은 간단합니다. 데이터 프레임이어야합니다. 이는 제한적이며 R. 격자 기능의 다른 그래픽 패키지와 달리 선택적 데이터 프레임을 취하거나 지구 환경에서 직접 벡터를 사용할 수 있습니다. ...

데이터는 플롯 객체에 참조가 아닌 사본으로 저장됩니다. 이것은 두 가지 중요한 결과를 가져옵니다. 데이터가 변경되면 플롯은 그렇지 않습니다. 그리고 GGPLOT2 객체는 완전히 자체적으로 포함되므로 디스크에 저장하고 나중에로드 () ED를 저장하고 해당 세션의 다른 것을 필요로하지 않고도 플롯 할 수 있습니다.

코드에는 목록 독트 스크립팅에 관한 버그가 있습니다. 그것은해야한다

pltList[[pltName]]

~ 아니다

pltList[pltName]

메모:

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

pltlist [1]은 a 목록 pltlist의 첫 번째 요소를 포함합니다.

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

pltlist [[1]]이 첫 번째입니다 요소 pltlist의.

두 번째 질문 : 다중 페이지 PDF는 쉽습니다. 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’.

당신의 주요 질문을 위해, 나는 당신이 플롯 입력 나중에 처리를위한 목록 또는 플롯 출력. 후자라면 확실하지 않습니다. plot() 저장하고 검색 할 수있는 객체를 반환합니다.

두 번째 질문에 관한 또 다른 제안은 스웨브 또는 브루를 사용하여 다중 페이지 PDF를 표시하는 방법을 완전히 제어 할 수 있도록하는 것입니다.

보세요 이 관련 질문에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top