It is possible to create inset graphs?

后端 未结 5 2050
北海茫月
北海茫月 2020-11-29 01:06

I know that when you use par( fig=c( ... ), new=T ), you can create inset graphs. However, I was wondering if it is possible to use ggplot2 library to create \

5条回答
  •  孤街浪徒
    2020-11-29 01:57

    I prefer solutions that work with ggsave. After a lot of googling around I ended up with this (which is a general formula for positioning and sizing the plot that you insert.

    library(tidyverse)
    
    plot1 = qplot(1.00*mpg, 1.00*wt, data=mtcars)  # Make sure x and y values are floating values in plot 1
    plot2 = qplot(hp, cyl, data=mtcars)
    plot(plot1)
    
    # Specify position of plot2 (in percentages of plot1)
    # This is in the top left and 25% width and 25% height
    xleft   = 0.05
    xright  = 0.30
    ybottom = 0.70
    ytop    = 0.95 
    
    # Calculate position in plot1 coordinates
    # Extract x and y values from plot1
    l1 = ggplot_build(plot1)
    x1 = l1$layout$panel_ranges[[1]]$x.range[1]
    x2 = l1$layout$panel_ranges[[1]]$x.range[2]
    y1 = l1$layout$panel_ranges[[1]]$y.range[1]
    y2 = l1$layout$panel_ranges[[1]]$y.range[2]
    xdif = x2-x1
    ydif = y2-y1
    xmin  = x1 + (xleft*xdif)
    xmax  = x1 + (xright*xdif)
    ymin  = y1 + (ybottom*ydif)
    ymax  = y1 + (ytop*ydif) 
    
    # Get plot2 and make grob
    g2 = ggplotGrob(plot2)
    plot3 = plot1 + annotation_custom(grob = g2, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)
    plot(plot3)
    
    ggsave(filename = "test.png", plot = plot3)
    
    # Try and make a weird combination of plots
    g1 <- ggplotGrob(plot1)
    g2 <- ggplotGrob(plot2)
    g3 <- ggplotGrob(plot3)
    
    library(gridExtra)
    library(grid)
    
    t1 = arrangeGrob(g1,ncol=1, left = textGrob("A", y = 1, vjust=1, gp=gpar(fontsize=20)))
    t2 = arrangeGrob(g2,ncol=1, left = textGrob("B", y = 1, vjust=1, gp=gpar(fontsize=20)))
    t3 = arrangeGrob(g3,ncol=1, left = textGrob("C", y = 1, vjust=1, gp=gpar(fontsize=20)))
    
    final = arrangeGrob(t1,t2,t3, layout_matrix = cbind(c(1,2), c(3,3)))
    grid.arrange(final)
    
    ggsave(filename = "test2.png", plot = final)
    

提交回复
热议问题