在R图形窗口中组合基础图形和ggplot图形


72

我想生成一个具有基本图形和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与layout或par(mfrow)结合使用。如何用ggplot生成的自相关图替换基本图形生成的自相关图?我知道如果我的所有图都是用ggplot制作的,我可以使用grid.arrange,但是如果ggplot中仅生成一个图,该怎么办?


3
polygon与的输出一起使用acf()来构建类似于该图的基础图形图可能几乎一样容易,并且看起来更加一致ggplot
Ben Bolker 2013年

感谢您的回复。这个问题的真正目的是学习如何在图形窗口中组合ggplot和基本图形,我意识到可能会有更有效的方法来生成所示图形,但是出于将来的目的,我想学习指定的方法。
KatyB

3
签出gridBase包裹...
Ben Bolker

您可能想看看该gridGraphics程序包,该程序包“ [将基本图形重新绘制为网格图形]”。
少校

尽管它被标记为重复,但此答案对我来说效果非常好:stackoverflow.com/a/21857177/1436851
Antoni

Answers:


53

使用gridBase包,只需添加2行即可。我认为,如果您想对网格进行有趣的绘制,则只需要了解和掌握视口即可。它确实是网格包的基本对象。

vps <- baseViewports()
pushViewport(vps$figure) ##   I am in the space of the autocorrelation plot

baseViewports()函数返回三个网格视口的列表。我在这里使用数字视口中的视口对应的人物区域当前图。

这是最终解决方案的外观:

在此处输入图片说明

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

是的,我已经尝试过了,这个问题是由ggplot生成的图比其他面板大得多(如您在上面看到的)。有改变的方法吗?
KatyB

+1非常好。如果更换调用acf(...)与调用plot.new(),你会避免打电话grid.rect()到“涂白”的ACF图。
乔什·奥布莱恩

1
只是b / c我回来了,看到您添加了这个更简单,更聪明的答案。
乔什·奥布莱恩

@ JoshO'Brien非常感谢!
agstudy 2013年

而不是在ggplot对象的方法中grid.draw(ggplotGrob(p))使用vp参数print
baptiste

15

您可以将print命令与grob和视口一起使用。
首先绘制基本图形,然后添加ggplot

library(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)

你好里卡多。您知道如何用您的方法控制图的宽度吗?例如,我想要一个基本图形和一个ggplot2图形并排,但是基本图形的宽度较大。
斯特凡·洛朗

嗨,史泰芬(Stéphane),您可以viewport()在行中调整设置。具体来说,您需要调整width和调整y值,尝试不同的值,直到获得所需的结果。
里卡多·萨波特塔

谢谢里卡多。实际上,我已经在这里打开了一个问题stackoverflow.com/questions/14358526/…–
史蒂芬·洛朗

7

我是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)

在此处输入图片说明


6

cowplot软件包具有recordPlot()捕获基本R图的功能,以便可以将它们放在一起使用plot_grid()

library(biwavelet)
library(ggplot2)
library(cowplot)
library(gridGraphics)

t <- c(1:(24*14)) 
P <- 24 
A <- 10 
y <- A*sin(2*pi*t/P)+20

plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series")
### record the previous plot
p1 <- recordPlot()  

spectrum(y,method = "ar",main = "Spectral density function", 
         xlab = "Frequency (cycles per hour)",ylab = "Spectrum")
p2 <- recordPlot()

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)")
p3 <- recordPlot()

acz <- acf(y, plot=F)
acd <- data.frame(lag=acz$lag, acf=acz$acf)
p4 <- ggplot(acd, aes(lag, acf)) + geom_area(fill="grey") +
  geom_hline(yintercept=c(0.05, -0.05), linetype="dashed") +
  theme_bw()

### combine all plots together
plot_grid(p1, p4, p2, p3,
          labels = 'AUTO',
          hjust = 0, vjust = 1)

reprex软件包(v0.2.1.9000)创建于2019-03-17

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.