R语言可视化——图表排版之一页多图

昨天跟大家分享了关于图表嵌套的函数用法,今天跟大家分享在多图情况下如何正确的进行图表的版面布局。

这里要分享的图表版面设计其实就是指,在做了很多图的情况下,如何将诸多图表合理的布局在一张大的版面上,而不是一幅一幅的导出最后在其他软件中手动拼凑。

这个技能在制作多图仪表盘场景下,将会特别有用:

还需要强调下这里所指的一页多图与我们之前介绍过的分面可是大有不同,分面其实是一幅图表中,将分类变量所构成的分类图表分图呈现,但是本质上所有分面内的单个图表共享标题、图例、坐标轴刻度(虽然可以手动定义)。

也就是说分面的图表类型与诸多元素都是一样的,但是分面解决不了不同图表的排版布局问题:比如单独绘制而成的一幅散点图、柱形图和一幅饼图,分面将无能为力。

R语言中可以实现多图同页布局的函数有很多(我所知道的旧有大概四五种),但是有些参数略微复杂不便记忆,这里只跟大家介绍两种:

一种是grid.layout函数(就是我们昨天所讲到的图表嵌套所用到的是同一个包),另一个是rmisc包中的multiplot函数:

grid.layout函数:

require(ggplot2)

require(grid)

绘制备用图表(这里必须给图表命名,因为最后制作汇总图的时候需要引用图表名称)

chart1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()

chart2 <- ggplot(diamonds, aes(carat, depth, colour = color)) + geom_point()

chart3<- ggplot(diamonds, aes(carat, depth, colour = color)) + geom_point() + facet_grid(.~color)

以上三个函数定义了三个图表对象,如果想要查看图表则只需给出图表名称然后回车即可:

grid.newpage() ###新建图表版面

pushViewport(viewport(layout = grid.layout(2,2))) ####将版面分成2*2矩阵

vplayout <- function(x,y){viewport(layout.pos.row = x, layout.pos.col = y)}

###定义图表的布局规则,也就是指定画布的行显示图表的X轴,列显示图表的Y轴。

print(chart3, vp = vplayout(1,1:2)) ###将(1,1)和(1,2)的位置画图chart3

print(chart2, vp = vplayout(2,1)) ###将(2,1)的位置画图chart2

print(chart1 , vp = vplayout(2,2)) ###将(2,2)的位置画图chart1

以上函数将逐步按照之前的位置规则按照对应顺序绘制三幅图表,每打印一次你都可以看到画布上增加一个图表。

以上是该方法制作一页多图的全部过程,其实因为里面有自定义函数,看起来稍微有点儿麻烦,不过不影响理解。

multiplot函数:

library("Rmisc")

library("lattice")

library("plyr")

使用multiplot函数制作一页多图的语法非常简单,过程同样也是先制作出单个图表并命名,然后一句函数就搞定:

multiplot(chart1,chart2,chart3, cols=2)

虽然使用multiplot函数非常方便高效,但是默认情况下,它不会对单个的图表长宽比例做最优布局,我们的案例中,chart3是一个水平分面图,属于矮款型的,但是multiplot函数将它压缩成长宽近似的矩形,放在四象限的第二个位置。

整体看上去,第一种方法虽然过程复杂些,但是局部灵活些,可以调整单个图表所占的空间,第二种方式更加高效、快捷,但是布局上欠缺优化(也许是我还没有接触到内部的局部调整参数,有懂的小伙伴儿麻烦指导一下,不胜感激)!

对了,做完图之后记得使用

dev.off() #

函数关闭活动版面,否则会影响之后的其他不相关图表!

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2016-10-05

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

WPF/Silverlight Layout 系统概述——Measure

前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写Measure...

2018
来自专栏逍遥剑客的游戏开发

Direct3D学习(六):动画基础(3)网格模型基础

1416
来自专栏数据小魔方

一篇小短文助你打开数据可视化的任督二脉!

本文主要讨论ggplot2是如何通过颜色信号来对多边形进行填充的底层理念,这也是想要进阶R语言数据可视化过程中必须搞明白的关键环节。 ggplot2所有图层对象...

3434
来自专栏MelonTeam专栏

[译]Android Interpolator详解

原文地址:<https://blog.mindorks.com/understanding-interpolators-in-android- ce4e8d1d...

2187
来自专栏WeTest质量开放平台团队的专栏

移动平台 Unity3D 应用性能优化(下)

下篇:一些关于移动平台上Unity3D的性能优化经验,供分享。

4191
来自专栏潇涧技术专栏

When Math meets Android Animation (1)

当数学遇上动画:讲述ValueAnimator、TypeEvaluator和TimeInterpolator之间的恩恩怨怨(1)

962
来自专栏慎独

Unity第三人称视角解决方案

2982
来自专栏诸葛青云的专栏

C语言控制台界版2048游戏-既然是这样的!

《2048》是最近比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于《1024》和《小3传奇》(T...

1100
来自专栏数据小魔方

频率统计函数——FREQUENCY

今天跟大家分享一个频率统计函数——FREQUENCY函数! ▽▼▽ 在统计一组数据各数量段频数的时候,如果能够善用频率函数,工作效率将会大大提高,当然频率统计也...

3375
来自专栏恰童鞋骚年

使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现。原本在C#中很方便地...

1303

扫码关注云+社区

领取腾讯云代金券