2013-01-09 26 views
10

I wytworzone postać, która łączy ggplot i zasadowe grafiki:aby płyty z tych samych marginesów podczas łączenia ggplot i zasadowe grafiki

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 

używać polecenia plotViewport i określone wymiary panelu zgodnie z wymiarami pierwszy panel, uzyskany przez par ("mai"). Załączona figura pokazuje wynik. enter image description here Jednak wymiary obu paneli nie są zgodne, tzn. Drugi panel wydaje się być nieco szerszy niż pierwszy. Jak mogę rozwiązać ten bez konieczności ręcznego ustawiania marginesów z

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

To jest wystarczająco trudne przy użyciu tylko jednego systemu graficznego, a co dopiero dwóch. Był kiedyś pakiet 'ggextra' z funkcją' align.plots', ale został on wycofany. Zobacz https://groups.google.com/forum/?fromgroups=#!topic/ggplot2-dev/4dKg-qA7eZE – Andrie

Odpowiedz

6

To powinno dać pewne wskazówki:

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

ale, naprawdę, dlaczego nie zrobić wszystko ggplot2?

+0

dzięki za to. Głównym powodem, dla którego chcieliśmy połączyć ggplot2 z podstawową grafiką było przekonanie, że niektóre wątki oparte na podstawowej grafice nie są zaimplementowane w siatce (na przykład biplot). – KatyB

3

Głównym celem jest przesunięcie 2 rzutni rzutowania bazowego, aby uzyskać wymiary panelu wykresu. Rozwiązanie nie jest ogólne.

Najpierw wykreślić mój podstawowy działka

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

drugi raz dostać wymiary panelu działce. Vpp zostaną wykorzystane tylko do wymiarów grobs ggplot (podobnych do idei Baptiste powyżej)

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

ggplot2 działce savec jak stół 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) 

mogę zmienić wymiary grobs. (Oto dlaczego rozwiązanie nie jest ogólnie)

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

wykreślić

grid.draw(gtable) 

enter image description here

+0

Sądzę, że po dokładnym sprawdzeniu, dwie nie będą dokładnie wyrównane, ponieważ ggplot wyśrodkuje swój wykres na rzutni, a marginesy lewy/prawy mogą się różnić. – baptiste

+0

@baptiste Masz rację. Osobiście nie jestem zadowolony z mojego rozwiązania. Kiedy testuję to z innymi mar, np. Mar (2,1) i mar (2,2) i musiałem zmodyfikować wymiary grobs. Ale dzięki mojemu rozwiązaniu ** vpp ** ma odpowiednie wymiary działki (testowałem to z grid.rect), być może możesz go użyć do modyfikacji gragów ggplot2. – agstudy