2013-01-09 19 views
10

tôi đã tạo ra một nhân vật kết hợp ggplot và cơ sở đồ họa:tạo ra những tấm với cùng một lề khi kết hợp ggplot và cơ sở đồ họa

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 

tôi sử dụng lệnh plotViewport và thiết lập kích thước của bảng điều khiển theo kích thước của bảng đầu tiên, thu được bằng mệnh giá ("mai"). Con số kèm theo cho thấy kết quả. enter image description here Tuy nhiên, kích thước của cả hai bảng không khớp nhau, tức là bảng điều khiển thứ hai có vẻ rộng hơn một chút so với bảng đầu tiên. Làm thế nào tôi có thể khắc phục điều này mà không cần phải tự đặt bên lề với

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

Đây là khó khăn đủ chỉ sử dụng một hệ thống đồ họa duy nhất, chứ chưa nói hai. Đã từng có một gói 'ggextra' với một hàm' align.plots' nhưng điều này đã không được chấp nhận. Xem https://groups.google.com/forum/?fromgroups=#!topic/ggplot2-dev/4dKg-qA7eZE – Andrie

Trả lời

6

này nên cung cấp cho bạn một số gợi ý:

screenshot

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

nhưng, thực sự, tại sao bạn không làm mọi thứ trong ggplot2?

+0

cảm ơn vì điều này. Lý do chính để muốn kết hợp đồ họa cơ sở ggplot2 và đồ họa cơ sở là ý nghĩ rằng một số ô dựa trên đồ họa cơ sở không được triển khai trong lưới (ví dụ: biplot). – KatyB

3

Ý tưởng chính là đẩy 2 chế độ xem của baseviewports để có được kích thước của bảng điều khiển cốt truyện. Giải pháp không phải là chung.

Trước tiên tôi vẽ cốt truyện cơ bản của tôi

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

Thứ hai tôi nhận được kích thước của bảng điều khiển âm mưu. vpp sẽ được sử dụng chỉ cho kích thước của grobs ggplot (tương tự như ý tưởng của Baptiste trên)

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

ggplot2 cốt truyện savec như một bảng 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) 

tôi thay đổi kích thước của grobs. (Ở đây tại sao giải pháp là không chung)

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

tôi âm mưu

grid.draw(gtable) 

enter image description here

+0

Tôi tin rằng khi kiểm tra chặt chẽ, cả hai sẽ không được căn chỉnh chính xác, vì ggplot sẽ căn giữa âm mưu của nó trên khung nhìn và lề trái/phải có thể khác nhau. – baptiste

+0

@baptiste Bạn nói đúng. Cá nhân tôi không hài lòng về giải pháp của tôi. Khi tôi thử nghiệm nó với mar khác, ví dụ mar (2,1) và mar (2,2) và tôi đã phải sửa đổi kích thước grobs. Nhưng với giải pháp của tôi ** vpp ** có kích thước phù hợp của cốt truyện (tôi đã thử nghiệm nó với grid.rect), có thể bạn có thể sử dụng nó để sửa đổi ggplot2 grobs. – agstudy

Các vấn đề liên quan