首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R figure窗口中合并base和ggplot图形

在R figure窗口中合并base和ggplot图形
EN

Stack Overflow用户
提问于 2013-01-02 23:15:02
回答 2查看 23.6K关注 0票数 76

我想生成一个图形,它有一个基础和ggplot图形的组合。下面的代码使用R的基本绘图函数显示了我的图形:

代码语言:javascript
复制
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看起来要好得多:

代码语言:javascript
复制
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生成的,我可以使用grid.arrange,但是如果只有一个图形是用ggplot生成的,我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-03 00:29:27

使用gridBase包,只需添加2行即可。我认为如果你想用网格做有趣的绘图,你只需要理解和掌握viewports即可。它实际上是grid包的基本对象。

代码语言:javascript
复制
vps <- baseViewports()
pushViewport(vps$figure) ##   I am in the space of the autocorrelation plot

函数的作用是:返回一个包含三个栅格视口的列表。我在这里使用figure Viewport与current plot的图形区域对应的视口。

下面是最终的解决方案:

代码语言:javascript
复制
library(gridBase)
library(grid)

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
票数 55
EN

Stack Overflow用户

发布于 2015-09-29 05:21:39

我是gridGraphics包的粉丝。由于某些原因,我在使用gridBase时遇到了麻烦。

代码语言:javascript
复制
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)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14124373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档