10

ggplot とベース グラフィックスを組み合わせた図を生成しました。

t <- c(1:(24*14)) 
P <- 24
A <- 10 
y <- A*sin(2*pi*t/P)+20 
#*****************************************************************************
par(mfrow = c(2,1))
plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude")
aa <- par("mai")
plot.new()

require(gridBase)
vps <- baseViewports()
pushViewport(vps$figure)
pushViewport(plotViewport(margins = aa)) ## I use 'aa' to set the margins 
#*******************************************************************************
require(ggplot2)
acz <- acf(y, plot = FALSE)
acd <- data.frame(Lag = acz$lag, ACF = acz$acf)
p <- ggplot(acd, aes(Lag, ACF)) + geom_area(fill = "grey") +
  geom_hline(yintercept = c(0.05, -0.05), linetype = "dashed") +
  theme_bw()
grid.draw(ggplotGrob(p)) ## draw the figure

plotViewport コマンドを使用し、par("mai") によって取得された最初のパネルの寸法に従ってパネルの寸法を設定します。添付の図は結果を示しています。 ここに画像の説明を入力 ただし、両方のパネルの寸法は一致しません。つまり、2 番目のパネルは最初のパネルよりもわずかに幅が広いように見えます。マージンを手動で設定しなくても、どうすればこれを克服できますか

pushViewport(plotViewport(c(4,1.2,0,1.2)))
4

2 に答える 2

6

これにより、いくつかのヒントが得られるはずです。

スクリーンショット

library(grid)
library(ggplot2)
require(gridBase)

par(mfrow = c(2,1))
plot(1:10)
a <- par("mai")
plot.new()
vps <- baseViewports()
pushViewport(vps$figure)

p = qplot(1:10, 1:10) + theme_bw() 
g <- ggplotGrob(p)

lw = unit(a[2], "inch") - sum(g$widths[1:3]) 

g$widths[[2]] <- as.list(lw + g$widths[[2]])
g$widths[[4]] <- as.list(unit(1, "npc") - unit(a[2] + a[4], "inch"))
g$widths[[5]] <- unit(a[4], "inch")
grid.draw(g)

# draw a shaded vertical band to test the alignment
grid.rect(unit(a[2], "inch"), unit(0, "inch"), 
          unit(1,"npc") - unit(a[2] + a[4], "inch"), 
          unit(2,"npc"),
          gp=gpar(lty=2, fill="red", alpha=0.1), hjust=0, vjust=0)

upViewport()

しかし、本当に、ggplot2 ですべてを実行しないのはなぜでしょうか?

于 2013-01-09T10:47:36.660 に答える
3

主なアイデアは、baseviewports の 2 つのビューポートをプッシュして、プロット パネルの寸法を取得することです。解決策は一般的ではありません。

まず、基本的なプロットをプロットします

t <- c(1:(24*14)) 
P <- 24
A <- 10 
y <- A*sin(2*pi*t/P)+20 
#*****************************************************************************
par(mfrow = c(2,1))
plot(t,y,type = "l",xlab = "Time (hours)",ylab = "Amplitude")
plot.new()

次に、プロット パネルの寸法を取得します。vpp は ggplot グロブの次元にのみ使用されます (上記のバプティストの考え方と同様)

require(gridBase)
vps <- baseViewports()
vpp <- pushViewport(vps$figure,vps$plot) ## here I add a new viewport
vpp <- current.viewport()
upViewport(2)

ggplot2 は、savec をグロブ テーブルとしてプロットします。

require(ggplot2)
p <- ggplot(acd, aes(Lag, ACF)) + geom_area(fill = "grey") +
  geom_hline(yintercept = c(0.05, -0.05), linetype = "dashed") +
  theme_bw()
data <- ggplot_build(p)
gtable <- ggplot_gtable(data)

グロブの寸法を変更します。(解決策が一般的ではない理由はここにあります)

gtable$heights[[2]] <- vpp$height
gtable$heights[[4]] <- vpp$height
gtable$widths[[4]]  <- vpp$width

私はプロットします

grid.draw(gtable)

ここに画像の説明を入力

于 2013-01-09T12:17:47.217 に答える