Объединение базовой и ggplot графики в окне R рисунок
Я хотел бы создать фигуру, которая имеет комбинацию базовой и ggplot графики. Следующий код показывает мою фигуру, используя базовые функции построения R:
t <- c(1:(24*14))
P <- 24
A <- 10
y <- A*sin(2*pi*t/P)+20
par(mfrow=c(2,2))
plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series")
acf(y,main = "Autocorrelation",xlab = "Lag (hours)", ylab = "ACF")
spectrum(y,method = "ar",main = "Spectral density function",
xlab = "Frequency (cycles per hour)",ylab = "Spectrum")
require(biwavelet)
t1 <- cbind(t, y)
wt.t1=wt(t1)
plot(wt.t1, plot.cb=FALSE, plot.phase=FALSE,main = "Continuous wavelet transform",
ylab = "Period (hours)",xlab = "Time (hours)")
который генерирует
большинство этих панелей выглядят достаточно для меня, чтобы включить в мой отчет. Однако график, показывающий автокорреляцию, нуждается в улучшении. Это выглядит намного лучше с помощью ggplot:
require(ggplot2)
acz <- acf(y, plot=F)
acd <- data.frame(lag=acz$lag, acf=acz$acf)
ggplot(acd, aes(lag, acf)) + geom_area(fill="grey") +
geom_hline(yintercept=c(0.05, -0.05), linetype="dashed") +
theme_bw()
однако, видя, как ggplot не является базой графический, мы не можем объединить ggplot с макетом или par(mfrow). Как я могу заменить график автокорреляции, созданный из базовой графики, сгенерированным ggplot? Я знаю, что могу использовать сетку.организуйте, если все мои фигуры были сделаны с помощью ggplot, но как это сделать, если в ggplot генерируется только один из графиков?
3 ответа:
используя пакет gridBase, вы можете сделать это, просто добавив 2 строки. Я думаю, если вы хотите сделать забавный сюжет с сеткой, вам нужно просто понять и освоить видовые экраны. Это действительно основной объект пакета grid.
vps <- baseViewports() pushViewport(vps$figure) ## I am in the space of the autocorrelation plot
функция baseViewports () возвращает список из трех видовых экранов сетки. Я использую здесь рисунок видового экрана Видовой экран, соответствующий области рисунка настоящее сюжет.
вот как выглядит окончательная решение:
library(gridBase) par(mfrow=c(2, 2)) plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series") plot(wt.t1, plot.cb=FALSE, plot.phase=FALSE,main = "Continuous wavelet transform", ylab = "Period (hours)",xlab = "Time (hours)") spectrum(y,method = "ar",main = "Spectral density function", xlab = "Frequency (cycles per hour)",ylab = "Spectrum") ## the last one is the current plot plot.new() ## suggested by @Josh vps <- baseViewports() pushViewport(vps$figure) ## I am in the space of the autocorrelation plot vp1 <-plotViewport(c(1.8,1,0,1)) ## create new vp with margins, you play with this values require(ggplot2) acz <- acf(y, plot=F) 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()+labs(title= "Autocorrelation\n")+ ## some setting in the title to get something near to the other plots theme(plot.title = element_text(size = rel(1.4),face ='bold')) print(p,vp = vp1) ## suggested by @bpatiste
вы можете использовать команду печати с grob и видовым окном.
Сначала постройте свою базовую графику, а затем добавьте ggplotlibrary(grid) # Let's say that P is your plot P <- ggplot(acd, # etc... ) # create an apporpriate viewport. Modify the dimensions and coordinates as needed vp.BottomRight <- viewport(height=unit(.5, "npc"), width=unit(0.5, "npc"), just=c("left","top"), y=0.5, x=0.5) # plot your base graphics par(mfrow=c(2,2)) plot(y,type #etc .... ) # plot the ggplot using the print command print(P, vp=vp.BottomRight)
Я поклонник пакета gridGraphics. По какой-то причине у меня были проблемы с gridBase.
library(ggplot2) library(gridGraphics) data.frame(x = 2:10, y = 12:20) -> dat plot(dat$x, dat$y) grid.echo() grid.grab() -> mapgrob ggplot(data = dat) + geom_point(aes(x = x, y = y)) pushViewport(viewport(x = .8, y = .4, height = .2, width = .2)) grid.draw(mapgrob)