12

オブジェクト内にプロットを保存することについて、昨日この質問をしました。最初のアプローチを実装しようとしましたが (元の質問で使用していることを指定しなかったことに注意してください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オブジェクトを除く)。

それほど重要ではない二次的な質問は、各ページに複数のプロットを含むマルチページ pdf を生成する方法でしたが、私のコードの主な目標は、後でアクセスできるリストにプロットを保存することでした。

4

5 に答える 5

11

わかりましたので、プロットコマンドが次のように変更された場合

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)           

その後、すべてが期待どおりに機能します。これが私が考えていることです(ただし、ハドリーはおそらく物事を明らかにすることができます). 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)

ただし、qplot でパラメーターを指定しない場合data、アタッチされた (読み取り: 保存された) データ フレームがないため、すべての変数が現在のスコープで評価されます。

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)

したがって、プロットが 2 回目に生成されるときは、元の値を使用するのではなく、 と の現在値が使用されます。xy

于 2009-11-30T20:14:08.283 に答える
5

I think you should use the data argument in qplot, i.e., store your vectors in a data frame.

See Hadley's book, Section 4.4:

The restriction on the data is simple: it must be a data frame. This is restrictive, and unlike other graphics packages in R. Lattice functions can take an optional data frame or use vectors directly from the global environment. ...

The data is stored in the plot object as a copy, not a reference. This has two important consequences: if your data changes, the plot will not; and ggplot2 objects are entirely self-contained so that they can be save()d to disk and later load()ed and plotted without needing anything else from that session.

于 2009-11-30T19:38:20.790 に答える
2

リストの添え字に関するコードにバグがあります。そのはず

pltList[[pltName]]

いいえ

pltList[pltName]

ノート:

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

pltList[1] は、pltList の最初の要素を含むリストです。

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

pltList[[1]] は pltList の最初の要素です。

于 2009-11-30T16:42:42.543 に答える
1

2 番目の質問に関するもう 1 つの提案は、Sweave または Brew のいずれかを使用して、複数ページの PDF の表示方法を完全に制御できるようにすることです。

この関連する質問を見てください。

于 2009-11-30T16:44:49.403 に答える
1

2 番目の質問については、複数ページの 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()保存および取得できるオブジェクトを返すかどうかはわかりません。

于 2009-11-30T16:07:10.920 に答える