专栏首页优雅R「R」R传统图形绘制多图

「R」R传统图形绘制多图

我这里只说 2 种常用方式,它们互相排斥:

  • 使用 par() 函数设定 mfrow 或者 mfcol 进行控制。
  • 使用 layout() 函数。

par() 函数

mfrowmfcol 都由 2 个数字指定,一个表示行数、一个表示列数。如果使用 mfrow,那么图像区域会被按行依次使用;如果使用 mfcol,那么图像区域会按列依次使用。

下面进行测试:

par(mfrow=c(2,2))
plot(1:10, main = "1")
plot(1:10, main = "2")
plot(1:10, main = "3")
plot(1:10, main = "4")
par(mfcol=c(2,2))
plot(1:10, main = "1")
plot(1:10, main = "2")
plot(1:10, main = "3")
plot(1:10, main = "4")

这区别应该一目了然吧?

布局函数 layout()

上面的方法创建的子图大小是相同的,而 layout() 就要高级不少。

layout() 将图片内部区域分割为一组行和列,但行高和列宽度可以分别控制,并且每个子图可以占据超过一行或一列的位置。

layout() 用矩阵作为参数来表示上述的思想,矩阵的值就是子图的序号。如果某子图序号多次出现,那么该子图就会占据多个区域。

layout(matrix(1:4, byrow=TRUE, ncol=2))
layout.show(4)

实现上一种方法的效果很简单:

layout(matrix(1:4, byrow=TRUE, ncol=2))
plot(1:10, main = "1")
plot(1:10, main = "2")
plot(1:10, main = "3")
plot(1:10, main = "4")
layout(matrix(1:4, byrow=FALSE, ncol=2))
plot(1:10, main = "1")
plot(1:10, main = "2")
plot(1:10, main = "3")
plot(1:10, main = "4")

再看下不等宽的情况:

layout(matrix(c(1, 1:3), byrow=TRUE, ncol=2))
plot(1:10, main = "1")
plot(1:10, main = "2")
plot(1:10, main = "3")

巧妙地设定矩阵,就可以自由实现多种组图方式了。不过显然到这里,还感觉差一些东西:默认情况下,所有的行高和列宽尺寸都是相同的, 而且内部也是以这种方式分割。怎么实现自定义的行高或列宽?

这需要设定 heightswidths 2 个选项。

layout(matrix(c(1:2)), heights = c(5, 3))
plot(1:10, main = "1")
plot(1:10, main = "2")

这里 heights 设定的是一个相对占比,比如子图 1 占 5/(5+3)。同样的操作可以应用到 widths上。

layout(matrix(c(1:2), ncol = 2), widths = c(5, 3))
plot(1:10, main = "1")
plot(1:10, main = "2")

0 可以用来进行占位,给图形留出更多的空间。

layout(matrix(c(1,0,2), ncol = 3), widths = c(5, 1, 3))
plot(1:10, main = "1")
plot(1:10, main = "2")

上述的数字设定都是相对的,使用选项 respect=TRUE 我们可以将它们映射到物理距离上。

layout(matrix(c(1,0,2), ncol = 3), widths = c(2, 0.2, 2), respect = TRUE)
plot(1:10, main = "1")
plot(1:10, main = "2")

我们也可以使用 lcm() 对某个图形进行厘米大小的设定,如上面的空隙大小。

layout(matrix(c(1,0,2), ncol = 1), widths = c(2, lcm(0.2), 1), respect = TRUE)
plot(1:10, main = "1")
plot(1:10, main = "2")

更多的操作查看文档啦~ 这里其实只要知道 layout() 函数,以及通过矩阵设定子图排列的思想使用起来就简单的。

更复杂的操作就要学习 grid 了,可能未来的某天我会学习并写写。

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「R」cowplot(四)图形排列

    如果你指定labels="AUTO"或labels="auto",那么标签会自动按照大写或小写排列:

    王诗翔呀
  • 「R」cowplot(一)介绍

    cowplot是ggplot2包的一个简单插件(或称拓展包),它的目的是为ggplot2提供一个出版级别的主题,使用少量代码即可实现主题统一的修改,如轴标签大小...

    王诗翔呀
  • 「R」R 的控制结构

    编程语言学多了你会发现虽然每一门编程语言都有其各自的语法、特性,但它们都有着一些程序内秉的框架:数据类型、条件判断、循环,所以才有了那句言简意赅的定义:

    王诗翔呀
  • 使用bokeh-scala进行数据可视化

    目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一、前言        最近在使用spark集群以及geotrellis框架(...

    魏守峰
  • oracle--事物特性、锁、

    eadela
  • 谷歌无人车离奇车祸曝光:人类安全员睡着后,误触关闭了自动驾驶

    一场已经被掩盖数月的谷歌无人车(Waymo)离奇车祸,刚刚被The Information曝光。车祸的发生地,就在距离谷歌加州山景城总部不远的高速公路上。

    量子位
  • Android样式的开发:layer-list篇

    上图Tab的背景效果,和带阴影的圆角矩形,是怎么实现的呢?大部分的人会让美工切图,用点九图做背景。但是,如果只提供一张图,会怎么样呢?比如,中间的Tab背景红色...

    Keegan小钢
  • 在Navicat中如何新建连接数据库及相关报错解决方法

        前几天给大家分享了如何安装Navicat,没有来得及上车的小伙伴可以戳这篇文章:手把手教你安装Navicat——靠谱的Navicat安装教程。今天给大家...

    Python进阶者
  • Python动态绑定属性slots的使用

    当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。废话不多说,我们看一个例子:

    py3study
  • Chrome 控制台新玩法console显示图片以及为文字加样式

    在正常模式下,一般只能向console 控制台输出简单的文字信息。但为了把信息输出得更优雅更便于阅读,除了cosole.log()方法外还可以调用 cosole...

    用户1065635

扫码关注云+社区

领取腾讯云代金券