2015-06-01 21 views
12

Ho una serie di elementi grafici ggplot2 con un numero costante di numeri orizzontali ma diversi di sfaccettature verticali. Vorrei salvare la grafica in formato .pdf in formato landscape a4.Come ottenere dimensioni e dimensioni di sfaccettatura identiche in diversi grafici ggplot2 a più facce?

Tuttavia, non so come posso raggiungere proporzioni identiche delle sfaccettature. Se provo a modificarlo manualmente e a variare width e height per diversi numeri di faccette verticali, le scale variano tra i grafici, cioè ottengo punti di dimensioni e linee di larghezza diverse.

In sostanza, come è possibile ottenere dimensioni e dimensioni di sfaccettature identiche per grafici con un numero variabile di sfaccettature (verticali)?

Ecco un esempio:

df <- expand.grid(a = 1:2, b = 1:5, x = 1:10) 
df$y <- df$x 
plot <- ggplot(data = df, mapping = aes(x = x, y = y)) + 
      geom_point() 
plot1 <- plot + facet_grid(facets = "a ~ b") 
plot2 <- plot + facet_grid(facets = ". ~ b") 

ggsave(filename = "./figures/plot1.pdf", plot = plot1, 
    height = 210, width = 297, units = "mm") 

ggsave(filename = "./figures/plot2.pdf", plot = plot2, 
    height = 210, width = 297, units = "mm") 

risposta

15

io uso questo codice per impostare le dimensioni dei pannelli a valori assoluti, forse aiuta qui

set_panel_size <- function(p=NULL, g=ggplotGrob(p), file=NULL, 
          margin = unit(1,"mm"), 
          width=unit(4, "cm"), 
          height=unit(4, "cm")){ 

    panels <- grep("panel", g$layout$name) 
    panel_index_w<- unique(g$layout$l[panels]) 
    panel_index_h<- unique(g$layout$t[panels]) 
    nw <- length(panel_index_w) 
    nh <- length(panel_index_h) 

if(getRversion() < "3.3.0"){ 

    # the following conversion is necessary 
    # because there is no `[<-`.unit method 
    # so promoting to unit.list allows standard list indexing 
    g$widths <- grid:::unit.list(g$widths) 
    g$heights <- grid:::unit.list(g$heights) 

    g$widths[panel_index_w] <- rep(list(width), nw) 
    g$heights[panel_index_h] <- rep(list(height), nh) 

} else { 

    g$widths[panel_index_w] <- rep(width, nw) 
    g$heights[panel_index_h] <- rep(height, nh) 

} 

    if(!is.null(file)) 
    ggsave(file, g, 
      width = convertWidth(sum(g$widths) + margin, 
           unitTo = "in", valueOnly = TRUE), 
      height = convertHeight(sum(g$heights) + margin, 
            unitTo = "in", valueOnly = TRUE)) 

    invisible(g) 
} 

print.fixed <- function(x) grid.draw(x) 
+0

Sicuramente risolto il mio problema, molte grazie a voi! – NoBackingDown

+1

questa funzione è copiata in 'egg :: set_panel_size()' – baptiste

Problemi correlati