ggplot2是R语言中用来可视化的利器,其图层逻辑非常人性化,简单的说就是一句话一张图,后一张图叠加在前一张图上,所想表达的几乎都可以用一句代码在图形上展示出来。如果刚开始接触R作图的话,完全可以快速地从ggplot2入门而不用去管base作图,ggplot2的用法已经完全覆盖base作图,除了一项(我至今接触到的)——图片布局

刚开始我也曾困惑过,base作图有par()函数来对多张图片进行布局排布,但该函数对于ggplot2的作图结果则是完全无效的。然后网上搜了一通,找了个grid包,其可以说专门用来排版图片的,当然也支持ggplot2,但是个人感觉使用起来不太顺手(由于其功能有点复杂了)。最近刚看到一个函数multiplot,查了下是来自Rmisc包,这个包发布于2013年,我在这之前也没用过,但是这个函数对于ggplot2结果图片的排布来说简单好使(后来简单看了下multiplot函数的源码,原来其就是用了grid包来实现布局的。。。相当于将grid包中关键的部分又封装了下),下面记录下上述两种方法: 先找一个测试集数据,查了下R自带的数据集,最后选用airquality数据集,其记录了纽约1973年5-9月份每日空气质量,如测量对象有Ozone,Solar.R,Wind,Temp

data

names(data)

#[1] "Ozone" "Solar.R" "Wind" "Temp" "Month" "Day"

我想用箱线图展示每个月份下上述4个测量值的变化,那么可以用代码一张一张分别作图,也可以用lapply函数进行循环作图,为了代码的整洁肯定选用后者

vars

p

ggplot(data, aes(x = Month, y = eval(parse(text = x)), fill = Month)) +

geom_boxplot(na.rm = T) +

labs(y = x, title = paste0(x, " In Different Months")) +

theme_light() +

theme(plot.title = element_text(hjust = 0.5)) +

guides(fill = "none")

})

这里有个小技巧,通常如果将function(x)中的x(x这里的类型是字符串)直接作为ggplot2的y变量的值是不行的,需要对x做个转化,这里就用了parse和eval函数,前者将x类型转化为表达式(但不求解),后者则是对表达式求解,我也是长见识了

p为列表,p[[1]]代表第一张图

用Rmisc包的multiplot函数

首先用最简单的方法做两张图

multiplot(plotlist = p[1:4], cols = 2)

rmisc_boxplot1

multiplot(plotlist = p[1:3], cols = 3)

rmisc_boxplot2

这里col表示每列的图片数目

我们还可以通过layout参数来设定图片的排布矩阵,如:

multiplot(plotlist = p[1:3], layout = matrix(c(1,2,3,3), nrow = 2))

rmisc_boxplot3

multiplot(plotlist = p[1:3], layout = matrix(c(1,2,3,3), nrow = 2, byrow = T))

rmisc_boxplot4

是不是很方便。。。。

用grid包的viewport函数

grib包的viewport函数可以画上面的所有布局的图(PS.multiplot函数本来就是调用grib包的,所以当然都可以画出来),但是有一种形式是multiplot函数无法比较方便的实现,但viewport函数可以(主要还是multiplot函数没封装完全,我看了下,重新改下函数,还是可以实现的),如下

先pushViewport设定一个空白画布,然后用pushViewport函数布局(主要用来设定后续viewport的可放置的位置)

library(grid)

grid.newpage()

pushViewport(viewport(layout = grid.layout(3,4)))

然后用print输出图片

print(p[[1]], vp = viewport(layout.pos.row = 1:3, layout.pos.col = 1))

print(p[[2]], vp = viewport(layout.pos.row = 1, layout.pos.col = 2:3))

print(p[[3]], vp = viewport(layout.pos.row = 3, layout.pos.col = 2:3))

print(p[[4]], vp = viewport(layout.pos.row = 1:3, layout.pos.col = 4))

grib_boxplot1

如果上述图片要用multiplot函数来实现,则需要这样写,PS.这矩阵写的好绕,还是viewport显得简洁了

multiplot(plotlist = p[1:4], layout = matrix(c(1,2,2,4,1,0,0,4,1,3,3,4), nrow = 3, byrow = T))

参考资料:

ggplot多图叠加_R作图 ggplot2图片的布局排版相关推荐

  1. html5中平铺图片,HTML布局排版2 div的和图片平铺方便管理

    在HTML里,由于浏览器显示器等差异,浏览器的宽度也会有变化,为了适应不同的宽度,需要用到平铺. 例如页面前面的固定的条等,如果是纯色,可以用背景色,如果不是纯色,是渐变等,可以用条状图平铺. 常见的 ...

  2. ggplot2箱式图两两比较_R语言ggplot2箱线图绘图总结

    主要从如何看图.用图与作图三个方面来对箱线图进行理解和总结. 1.看图 箱线图概述图1 箱线图概述图2 如图所示,箱线图是将一组数据按照大小顺序排列后进行绘制的,包含6个数据节点,分别表示出数据的上边 ...

  3. r 语言 ggplot上添加平均值_R语言中ggplot2包作数据分布情况下的统计图实例学习(一)

    1.小提琴图 小提琴图可以可视化一组或几组数字变量的分布. 问题:您想制作一个小提琴图来比较不同组的密度估计.用gcookbook包与ggplot2包分别绘制. 解决问题: 使用geom_violin ...

  4. r语言 图形一览_R语言统计与绘图:ggplot2图形组合布局

    在科研论文中,有时我们需要绘制几张图形,并将这几张图形整合到一张大图上面. 前面我们学习了基础绘图包怎么组合布局图形,今天来学习两个新函数,看ggplot2绘制的图形怎么组合. ggplot2组合图形 ...

  5. OpenCV如何叠加大小不同的图片

    有时候我们想叠加不同大小的图片,类似于把一个小Logo加到原本图片上去,且能指定Logo的位置,由于add()函数要求输入的图片格式.尺寸相同,所以不能直接使用add()函数,因此再使用之前要先定义感 ...

  6. 高德地图与CAD图叠加显示方法汇总及优缺点分析

    前言 ​ 高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能.如高德影像地图应用在包括地理.土地测量.水文学.生态学.气象学以及海洋学等方面.Auto ...

  7. 让 UI 早点下班,高阶切图技巧!基于单张图片的任意颜色转换!

    今天,要介绍一种基于 CSS mask-composite 的高级技巧. 通过掌握它,我们可以通过一张 图片,得到关于它的各种变换,甚至乎,得到各种不同颜色的变换. 通过单张 PNG/SVG 得到它的 ...

  8. R语言删除ggplot可视化图中的所有x轴轴标签实战:ggplot可视化默认包含所有x轴轴标签、删除ggplot可视化图中的所有x轴轴标签实战

    R语言删除ggplot可视化图中的所有x轴轴标签实战:ggplot可视化默认包含所有x轴轴标签.删除ggplot可视化图中的所有x轴轴标签实战 目录

  9. u-tools图床便捷生成markdown图片

    u-tools 图床 上传图片生成markdown图片非常便捷. 支持的图片服务器有几种,其中搜狗.网易和掘金的加载速度更快些: 也可以用阿里与和腾讯云的OSS; 其中网易生成图片不是原图尺寸好像被改 ...

  10. html将两张图重叠居中代码,【CSS技巧】多图片的垂直居中排版

    多图片的垂直居中排版,比如相册中相片的缩略图展示页,如图所示: 先看效果: 代码如下: ============================ -//W3C//DTD XHTML 1.0 Trans ...

最新文章

  1. 某外包程序员炫耀:不用管绩效和代码质量,工作摸鱼,从不加班,没有pua,外包是真的舒服!...
  2. Custom Url Helper for Zend View
  3. Leetcode 347. 前K个高频元素 解题思路及C++实现
  4. php 公交 查询系统,php定做单城市公交路线查询系统
  5. C++用二进制交换二个数的实现算法(附完整源码)
  6. QT的QDesignerMemberSheetExtension类的使用
  7. VMware VIC
  8. fusionsphere读音_hydroxyapatite
  9. java response.write_@ResponseBody与response.getWriter .write()区别
  10. linux百度云备份文件夹,Linux环境下载百度网盘文件
  11. 解决dom4j java.lang.NoClassDefFoundError: org/jaxen/JaxenException
  12. OpenShift 4 - Fedora CoreOS (3) - 定制 CoreOS ISO
  13. 老师使用计算机给小孩子上课,“某某中学教师课堂教学现状”调查问卷
  14. DevExpress gridcontrol添加了复选框删除选中的多行/批量删除的方法
  15. python装饰器语法糖_最全python装饰器的各种写法
  16. Scrapy分布式、去重增量爬虫的开发与设计
  17. Ubuntu Quickbuild 安装配置
  18. 简单的 XML、DTD 文件
  19. DescribingDesign Patterns 描述设计模式
  20. 多线程练习题(双色球)

热门文章

  1. c语言文件分割与合并
  2. error: Apostrophe not preceded by \ (in XXX.)
  3. 假装自己升级了Win11~
  4. Shader学习7——法线贴图
  5. UOM物料单位转换(同类型才能转换)
  6. 如何在Word中插入Notepad++样式的代码段
  7. Android开发者的Ane简单入门
  8. 新媒体运营胡耀文教程:短视频+怎么变现?一文读懂4大商业模式
  9. 戴尔/外星人笔记本C盘空间占用疑难问题记录
  10. 最新最全论文合集——基于背景知识的对话系统