プロットオブジェクトをリストに保存する
-
10-07-2019 - |
質問
プロットを保存することについて昨日この質問をしましたオブジェクト内。最初のアプローチを実装しようとしました(元の質問で 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のセットを問題なく書き込むため、正しいプロットのpdfが16個あります。
次に、このコードを使用する場合:
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を生成する方法でしたが、私のコードの主な目標は、後でアクセスできるリストにプロットを保存することでした
解決
OK、だからもしプロットコマンドが
に変更されたら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回目にプロットを生成するとき、 x
および y
current 値を使用します>。
他のヒント
qplot
で data
引数を使用する、つまりデータフレームにベクトルを保存する必要があると思います
Hadleyの本のセクション4.4を参照してください:
データの制限は簡単です。データフレームでなければなりません。これは制限的であり、Rの他のグラフィックパッケージとは異なり、ラティス関数はオプションのデータフレームを取るか、グローバル環境から直接ベクトルを使用できます。 ...
データは、参照ではなくコピーとしてプロットオブジェクトに保存されます。これには2つあります 重要な結果:データが変更されても、プロットは変更されません。およびggplot2オブジェクトは完全に自己完結型であるため、ディスクにsave()dし、後でそのセッションから何も必要とせずにload()およびプロットできます。
リストの添え字に関するコードにバグがあります。
pltList[[pltName]]
ない
pltList[pltName]
注:
class(pltList[1])
[1] "list"
pltList [1]は、pltListの最初の要素を含む list です。
class(pltList[[1]])
[1] "ggplot"
pltList [[1]]はpltListの最初の要素です。
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()
が格納および取得できるオブジェクトを返すかどうかはわかりません。
2番目の質問に関する別の提案は、SweaveまたはBrewを使用することです。複数ページのPDFの表示方法を完全に制御できるためです。
この関連質問をご覧ください。
>