美文网首页
Grid 学习笔记

Grid 学习笔记

作者: 吴十三和小可爱的札记 | 来源:发表于2020-05-11 12:04 被阅读0次

    Introduction

    grid包是一个底层的绘图系统,能够灵活地控制图形输出的外观和布局,它能把图形逐个地添加到画布中设定好的位置上去。grid包不仅可以输出图形,还可以产生图形组件并复用和重组,形成复杂图形,也是lattice 和 ggplot2 的基础系统,理论上来讲能够完成一切可视化方案。 由于lattice 和 ggplot2 是基于grid 开发的,所以了解grid 系统有利于实现更灵活多变的可视化方案。

    start a new page

    All grid output occurs relative to the current viewport (region) on a page. In order to start a new page of output, the user must call the grid.newpage() function.

    Create a Grid Viewport

    viewport是grid包的核心对象和基础,即画布中的一个矩形的绘图区域,可通过viewport()函数新建窗口对象。

    参数注释:

    1. x:x坐标相对整个窗口x轴位置
    2. y:y坐标中心相对整个窗口y轴位置
    3. just:x和y所指的位置,默认为矩形中心位置
    4. plotViewport()
    5. dataViewport()

    换句话说:通过这三个参数即可设定可视化窗口。

    library(grid)
    library(ggplot2)
    ####
    grid.newpage()
    grid.show.viewport(viewport(x = 0.5, y = 0.5, width = 0.5,height = 0.5))
    
    ####
    grid.newpage()
    vp1 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5)
    plot1 <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
      geom_point(aes(colour = Species)) 
    print(plot1, vp = vp1)
    
    image.png
    ####
    grid.newpage()
    grid.show.viewport(viewport(x=0.5, y= 0.5, width = 0.5, height=0.5, just = c("left","bottom")))
    
    image.png
    ####
    grid.newpage()
    vp2 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5, just = c("left","bottom"))
    
    print(plot1, vp = vp2)
    
    image.png

    viewport layout

    layout:申明对目前画布进行拆分 layout.pos.row;layout.pos.col:可视化实现的位置,一般与grid.layout() 参数有关。

    library(grid)
    library(ggplot2)
    
    ####
    plot <- ggplot(data = iris, aes(x = Sepal.Length, 
                                     y = Sepal.Width)) + 
      geom_point(aes(colour = Species)) + 
      theme(legend.position=c(0.8,0.7))
    
    ####
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(4, 4)))
    print(plot, vp = viewport(layout.pos.row = 3:4, layout.pos.col = 1:2))
    print(plot, vp = viewport(layout.pos.row = 1, layout.pos.col = 1:2))
    print(plot, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 3:4))
    
    image.png

    viewport tree

    Grid同样能够通过树状结构管理矩形区域。 * pushViewport():将指定的矩形区域插入为当前画布的子节点,同时画布转移为刚插入的viewport。 * upViewport():当前viewport移动到父节点; * downViewport():当前viewport移动到指定name的子节点;

    library(grid)
    library(ggplot2)
    
    grid.newpage()
    
    ####
    vp1 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5)
    pushViewport(vp1)
    plot <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
      geom_point(aes(colour = Species)) 
    print(plot , newpage = F)
    upViewport() #返回父节点 
    
    ####
    vp2 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5, just = c("left","bottom"))
    pushViewport(vp2)
    print(plot , newpage = F)
    
    image.png

    vpTree

    可以利用vpTree提前规划作图矩形区域,以便进行分区域可视化。 * seekViewport():搜索指定name的viewport,将其设置为当前画布。 * popViewport():删除当前viewport,同时转移画布为其的父节点; ** vpList 里面的所有viewport 的等级是平行的,而vpStack中的是按输入viewport 的顺序 树状排列。**

    ####
    library(grid)
    library(ggplot2)
    
    grid.newpage()
    
    # set up viewport
    vp1 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5,
                    name = "vp1")
    
    vp2 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5, 
                    just = c("left","bottom"), name = "vp2")
    
    vp3 <- viewport(x = 0.5, y = 0.5, width = 0.5, height = 0.5, 
                    just = c("right","top"), name = "vp3")
    
    # 规划矩形区域: vp为第一层, vp1-3并列为第二层
    tree <- vpTree(viewport(x = 0.5, y = 0.5, width = 1, height = 1,
                            name = "vp"),
                   vpList(vp1, vp2, vp3))
    
    # push
    pushViewport(tree)
    
    plot <- ggplot(data = iris, aes(x = Sepal.Length, 
                                     y = Sepal.Width)) + 
      geom_point(aes(colour = Species)) + 
      theme(legend.position=c(0.8,0.7)) 
    
    seekViewport("vp")
    print(plot, newpage = FALSE)
    
    seekViewport("vp1")
    print(plot, newpage = FALSE)
    
    seekViewport("vp2")
    print(plot, newpage = FALSE)
    
    seekViewport("vp3")
    print(plot, newpage = FALSE)
    
    image.png

    geom

    以grid.XX 格式出现的相关函数,基本和ggplot2 中geom_格式的函数相似,一般用于图形变换。

    grid.rect(...)   
    grid.lines(...)  
    grid.polygon(...)
    grid.circle(...)
    grid.text(...)
    

    Grob

    与grid.XX 一样,但Grob 对象不会输出可视化结果,而是创建可以复用和重组的图形组件。 可用grid.draw() 显示相应组件,而grid.edit 可用于修改相应组件。

    有的包如ggplot2 只是在作图ing时,才会产生grid 组件,因此可以先进行可视化,然后通过grid.force() 强制产生组件,然后用grid.ls()查看组件然后修改。其实没太大意义,首先是ggplot2 图形界面修改链接已经非常多了。而且其输出对象非常复杂,如不是特殊必要(写包),可能没必要去阅读那些组件。
    
    ####
    library(grid)
    library(ggplot2)
    
    ####
    grid.newpage()
    my_rect <- rectGrob(name = "my_rect", x = 0.5, 
                        y = 0.5, width = 0.8, height = 0.3)
    grid.draw(my_rect)
    
    image.png
    grid.edit("my_rect", gp = gpar(col = "red", lty = 1))
    
    image.png
    ####
    grid.newpage()
    plot <- ggplot(data = iris, aes(x = Sepal.Length, 
                                    y = Sepal.Width)) + 
      geom_point(aes(colour = Species)) 
    plot
    grid.force()
    
    image.png
    grid.ls()
    
    ## layout
    ##   background.1-11-12-1
    ##   panel.7-5-7-5
    ##     grill.gTree.743
    ##       panel.background..rect.734
    ##       panel.grid.minor.y..polyline.736
    ##       panel.grid.minor.x..polyline.738
    ##       panel.grid.major.y..polyline.740
    ##       panel.grid.major.x..polyline.742
    ##     NULL
    ##     geom_point.points.730
    ##     NULL
    ##     panel.border..zeroGrob.731
    ##   spacer.8-6-8-6
    ##   spacer.8-4-8-4
    ##   spacer.6-6-6-6
    ##   spacer.6-4-6-4
    ##   axis-t.6-5-6-5
    ##   axis-l.7-4-7-4
    ##     NULL
    ##     axis
    ##       axis.1-1-1-1
    ##         GRID.text.750
    ##       axis.1-2-1-2
    ##   axis-r.7-6-7-6
    ##   axis-b.8-5-8-5
    ##     NULL
    ##     axis
    ##       axis.1-1-1-1
    ##       axis.2-1-2-1
    ##         GRID.text.746
    ##   xlab-t.5-5-5-5
    ##   xlab-b.9-5-9-5
    ##     GRID.text.754
    ##   ylab-l.7-3-7-3
    ##     GRID.text.757
    ##   ylab-r.7-7-7-7
    ##   guide-box.7-9-7-9
    ##     legend.box.background.2-4-4-2
    ##     guides.3-3-3-3
    ##       background.1-6-7-1
    ##       title.2-5-2-2
    ##         guide.title.titleGrob.762
    ##           GRID.text.760
    ##       key-3-1-bg.4-2-4-2
    ##       key-3-1-1.4-2-4-2
    ##       key-4-1-bg.5-2-5-2
    ##       key-4-1-1.5-2-5-2
    ##       key-5-1-bg.6-2-6-2
    ##       key-5-1-1.6-2-6-2
    ##       label-3-3.4-4-4-4
    ##         guide.label.titleGrob.765
    ##           GRID.text.763
    ##       label-4-3.5-4-5-4
    ##         guide.label.titleGrob.768
    ##           GRID.text.766
    ##       label-5-3.6-4-6-4
    ##         guide.label.titleGrob.771
    ##           GRID.text.769
    ##   subtitle.4-5-4-5
    ##   title.3-5-3-5
    ##   caption.10-5-10-5
    ##   tag.2-2-2-2
    
    # grid.edit("geom_point.points.2855", 
    #          gp = gpar(col = c("white","red", "navy")))
    
    # point 后缀数字一直在改变。。。
    

    gpar

    gpar() 和基础绘图函数par()一样,用于创建图形参数对象,例如:外框颜色、填充颜色、透明度、线段类型、线段宽度等。

    gp <- get.gpar() # 获取现存gpar参数
    utils::str(gp)   # 整齐输出gpar参数
    
    • col Colour for lines and borders.
    • fill Colour for filling rectangles, polygons, …
    • alpha Alpha channel for transparency
    • lty Line type
    • lwd Line width
    • lex Multiplier applied to line width
    • lineend Line end style (round, butt, square)
    • linejoin Line join style (round, mitre, bevel)
    • linemitre Line mitre limit (number greater than 1)
    • fontsize The size of text (in points)
    • cex Multiplier applied to fontsize
    • fontfamily The font family
    • fontface The font face (bold, italic, …)
    • lineheight The height of a line as a multiple of the size of text
    • font Font face (alias for fontface; for backward compatibility)

    gTree

    利用gTree 的可以灵活的构建复杂的gpar 组件,其中一般是就近原则,靠近谁就用谁的参数,可以用grid包自带的函数进行说明:

    ####
    library(grid)
    
    ####
    grid.newpage()
    vp <- viewport(w = .8, h = .8, gp = gpar(col="blue"))
    pushViewport(vp) #push viewport
    gp <- get.gpar() # 获取现存gpar参数
    utils::str(gp)   # 整齐输出gpar参数
    
    ## List of 14
    ##  $ fill      : chr "white"
    ##  $ col       : chr "blue"
    ##  $ lty       : chr "solid"
    ##  $ lwd       : num 1
    ##  $ cex       : num 1
    ##  $ fontsize  : num 12
    ##  $ lineheight: num 1.2
    ##  $ font      : int 1
    ##  $ fontfamily: chr ""
    ##  $ alpha     : num 1
    ##  $ lineend   : chr "round"
    ##  $ linejoin  : chr "round"
    ##  $ linemitre : num 10
    ##  $ lex       : num 1
    ##  - attr(*, "class")= chr "gpar"
    
    grid.text("This text is the colour set by the viewport (blue)",
              y = 1, just = c("center", "bottom"),
              gp = gpar(fontsize = 20), vp = vp)
    # viewport = vp, 表现与vp中的gpar参数想同
    
    ####
    grid.draw(gTree(children = gList(rectGrob(gp = gpar(col="red")),
                                   textGrob(paste("The rect is its own colour (red)",
                                                  "but this text is the colour",
                                                  "set by the gTree (green)",
                                                  sep = "\n"))),
                    gp = gpar(col = "green"), vp = vp))
    
    image.png
    gp <- get.gpar() # 获取现存gpar参数
    utils::str(gp)   # 整齐输出gpar参数
    
    ## List of 14
    ##  $ fill      : chr "white"
    ##  $ col       : chr "blue"
    ##  $ lty       : chr "solid"
    ##  $ lwd       : num 1
    ##  $ cex       : num 1
    ##  $ fontsize  : num 12
    ##  $ lineheight: num 1.2
    ##  $ font      : int 1
    ##  $ fontfamily: chr ""
    ##  $ alpha     : num 1
    ##  $ lineend   : chr "round"
    ##  $ linejoin  : chr "round"
    ##  $ linemitre : num 10
    ##  $ lex       : num 1
    ##  - attr(*, "class")= chr "gpar"
    

    我们可以看到现存图形界面中的gpar是没有改变的,但:

    1. grid.text 以vp 中的gpar 参数为基础
    2. rectGrob 以自带的gpar 参数构建
    3. textGrob 以gTree 设定的 gpar 构建

    more

    package document

    gridExtra CRAN page

    相关文章

      网友评论

          本文标题:Grid 学习笔记

          本文链接:https://www.haomeiwen.com/subject/clfunhtx.html