如何将图表放入网格中

时间:2012-11-04 07:06:48

标签: r

有没有办法将.png放入网格中。我想使用网格在一个中显示4个.png单个图表。

enter image description here

3 个答案:

答案 0 :(得分:2)

正如其他人所说,这可能不是一个好主意,但

library(gridExtra)
library(png)

img <- rasterGrob(readPNG(system.file("img", "Rlogo.png", package="png")),
width=unit(1,"npc"), height=unit(1,"npc"))


grid.arrange(img, img, img, img, ncol=2)

将在设备上显示2x2 png文件。

答案 1 :(得分:1)

在基本图形中至少有三种方法可以做到这一点。

  1. 使用layout()(我最喜欢的):

    layout(matrix(1:4, ncol = 2))
    for(i in 1:4)
        plot(1:10)
    layout() # reset
    

    使用layout()传入包含整数的矩阵,该整数将设备分割成的子图编入索引。如何在矩阵中排列这些索引来控制布局。 2x2布局由此矩阵

    给出
    R> matrix(1:4, ncol = 2)
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    

    请注意按列填充。要按行填充,请在byrow = TRUE调用

    中使用matrix()
    R> matrix(1:4, ncol = 2, byrow = TRUE)
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    

    更复杂的布局,可以通过在矩阵中创建索引来实现2x2布局,就像您希望设备看起来一样。例如,对于具有3行的设备,第一行包含设备右侧的1个绘图区域,第二行具有覆盖整行和第三行2个绘图区域的单个绘图区域,我们将执行此操作

    matrix(c(0,1,
             2,2,
             3,4), ncol = 2, byrow = TRUE)
    

    用图表填充

    layout(matrix(c(0,1,
                    2,2,
                    3,4), ncol = 2, byrow = TRUE))
    for(i in 1:4)
        plot(1:10)
    layout(1) # reset
    

    enter image description here

    使用split.screen()可以实现类似的布局。见下文。

  2. 使用mfrowmfcol参数。前者用行填充设备,后者按行填充

    op <- par(mfrow = c(2,2))
    for(i in 1:4)
        plot(1:10)
    par(op)  # reset
    
  3. 第三种方法是使用split.screen()

    split.screen(c(2,2))
    for(i in 1:4) {
        screen(i)
        plot(1:10)
    }
    close.screen(all = TRUE) # reset
    

    split.screen()也可以采用矩阵输入,例如layout()

  4. 根据您将设备拆分的绘图区域数量,您可能需要或想要缩小绘图的边距。为此,请参阅?par以及定义边距的各种方式(例如参数mar)。

    要将这些作为PNG文件,请将所有命令包装在

    png(file = "foo.png", .....) ## the ..... is where you place options, see ?png
    
    ## plotting commands here
    
    dev.off()
    

    e.g。

    png("layout.png", height = 600, width = 600, pointsize = 14)
    layout(matrix(c(0,1,
                    2,2,
                    3,4), ncol = 2, byrow = TRUE))
    for(i in 1:4)
        plot(1:10)
    layout(1) # reset
    dev.off()
    

    [这是我用来创建上面显示的情节图。]

答案 2 :(得分:0)

如果您熟悉ggplot,facet_grid()可能就是您要找的地方:

df <- data.frame( x = rnorm(40), y = rnorm(40) )
df <- cbind( df, expand.grid( c('A', 'B'), c('C', 'D' ) )  )
head( df )

            x          y Var1 Var2
1 -1.27990165  1.1697183    A    C
2 -0.65083905  0.4743215    B    C
3  0.23181562  0.5092162    A    D
4 -0.01370950 -0.1704988    B    D
5 -1.20182791 -0.3525845    A    C
6  0.04877524  0.8801793    B    C

library( "ggplot2" )
g <- ggplot( df ) +
  geom_point( aes(x = x, y = y) ) +
  facet_grid( Var1 ~ Var2 )
ggsave( "plot.png", g )

enter image description here