Создавать панели с одинаковыми полями при комбинировании ggplot и базовой графики
Я создал фигуру, которая сочетает в себе 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"). На рисунке показан результат.Однако размеры обеих панелей не совпадают, то есть вторая панель кажется немного шире, чем первая. Как я могу преодолеть это без необходимости вручную устанавливать поля с
pushViewport(plotViewport(c(4,1.2,0,1.2)))
2 ответа
Это должно дать вам несколько советов:
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?
Основная идея состоит в том, чтобы выдвинуть 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 plot savec как таблица grob:
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)