前言

作者:安建才

知乎:https://www.zhihu.com/people/an-jian-cai-69/pins/posts

欢迎关注支持!

ggplot2 包是 Hadly Wickham 开发(除 ggplot2 外,还有 plyr 和 reshape2 包)的一款通过 “+”,以图层叠加的搭配组合,易于实现数据可视化的 R 包。ggplot2 以美轮美奂的统计制图能力位居各类绘图软件排名前列,同时此包功能也在增加。此文简单介绍 ggplot2 的基本原理和操作,便于大家对 ggplot2 快速入门。

ggplot() 作为泛型函数(gplot() 能快速作图,却不是泛型函数),能对任意类型的 R 对象进行可视化操作,这是 ggplot2 的精髓所在。

在 Hadly 的 ggplot2 官方文档中,Hadely 这样对 Wilkinson 的图形语法进行了描述:“一张统计图形就是从数据到集合对象(geometric object, 缩写为 geom,包括点、线、条形等)的图形属性(aesthetic attributes, 缩写为 aes, 包括颜色、形状、大小等)的一个映射。此外,图形中还可能包含数据的统计变换(statistical transformation, 缩写为 stat),最后绘制在某个特定的坐标系(coordinate system, 缩写为 coord)中,而分面(facet, 指将绘图窗口划分为若干个子窗口)则可以用来生成数据中不同子集的图形。” 因此,在 ggplot2 中,图形语法中至少包括了如下几个图形部件:

1、  数据(data)

2、  映射(mapping)

3、  几何对象(geom)

4、  统计变换(stat)

5、  坐标系(coord)

6、  分面(facet)

7、  标度(scale)

这些组件之间用 “+”,以图层(layer)的方式来粘合构图的,所以图层是 ggplot2 中一个重要的概念;在掌握基本的图形部件基础上,要完成一幅高质量的统计绘图,仍然需要其他图形部件来进一步扩展,这包括了:

8、  主题(theme)

9、  位置(position)

10、存储和输出

接下来将对上述概念展开讲述


数据(data)

1、在 ggplot2 中,所接受的数据集必须为数据框(data.frame)格式。

如内置的 mtcars 数据集:head(mtcars)

2、这种数据框的格式好处是数据易于存储,也能保留原有的绘图参数下,用 %+% 方便地变更已有数据集。如:

library(ggplot2)
p <- ggplot(mtcars,aes(mpg,wt,colour=cyl))+geom_point()
p

mtcarsc <- transform(mtcars,mpg = mpg^2)
p %+% mtcarsc

3、 ggplot2 进行数据分组时必须根据行, 而不能根据列。 例如在 mtcars 的数据集中, 可以把汽车按汽缸数进行分组, 但不能按汽车的档位数和汽缸数这两个变量分为两组。这要求把 “宽” 数据转化为 “长” 数据。所谓的长数据是变量不在是放在各个列上, 而是排成一列, 每一个变量都分别占其中的几行, 这样就能方便的对每个变量进行分组。reshape2中 melt() 和 cast() 能够灵活的融合 (melt) 和重铸 (cast) 在数据框中的数据。如:

library(reshape2)
mtcarsm <- melt(mtcars, id = c("mpg","disp","hp","drat","wt","qsec","vs","carb"))
head(mtcarsm)


映射(mapping)

1、 概念

aes() 函数是 ggplot2 中的映射函数, 所谓的映射即为数据集中的数据关联到相应的图形属性过程中一种对应关系, 如:

p1 <- ggplot(data = mtcars)
summary(p1)

p2 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, color = gear))
summary(p2)

发现, 在 p2 中, 通过 aes() 指定了横纵坐标分别为 wt 和 hp、 颜色为 gear 这三种图形属性。 在 ggplot2 中不同的几何对象对应着不同的图形属性。

2、  设定和映射

映射是将一个变量中离散或连续的数据与一个图形属性中以不同的参数来相互关联, 而设定能够将这个变量中所有的数据统一为一个图形属性。如:

p <- ggplot(mtcars, aes(wt, mpg))
#设定散点的颜色为蓝色
p + geom_point(color = "blue")

3、 分组(group)

分组也是 ggplot2 种映射关系的一种, 默认情况下 ggplot2 把所有观测点分为了一组, 如果需要把观测点按额外的离散变量进行分组处理, 必须修改默认的分组设置。

p3 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp)) + geom_line()
p3

p4 <- ggplot(data = mtcars, mapping = aes(x = wt, y = hp, group = factor(gear))) + geom_line()
p4


几何对象 (geom) 和统计变换 (stat)

几何对象执行着图层的实际渲染, 控制着生成的图像类型。例如用 geom_point() 将会生成散点图, 而 geom_line 会生成折线图。几何对象如下:

具体应用如:

p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()

#更改颜色-连续变量
p + geom_point(aes(color = qsec))

#更改颜色-离散变量
p + geom_point(aes(color = factor(gear)))

#更改透明度
p + geom_point(aes(alpha = qsec))

#更改形状
p + geom_point(aes(shape = factor(gear)))

#更改点大小
p + geom_point(aes(size = qsec))

#两种颜色的叠加
p + geom_point(color = "grey50", size = 5) + geom_point(aes(color = qsec), size = 4)

#颜色和形状的叠加
p +geom_point(color = "grey50", size = 5) + geom_point(aes(shape = factor(gear)), size = 3)

统计变换即对数据进行统计变化, 通常以某种方式对数据信息进行汇总, 例如通过 stat_smooth() 添加光滑曲线。统计对象如下:

每一个几何对象都有一个默认的统计变换并且每一个统计变换都有一个默认的几何对象。正因如此这一设定将会使绘图过程变的灵活多变。

具体应用如:

m <- ggplot(mtcars, aes(qsec, wt))
m + stat_smooth() + geom_point()

#取消默认的置信区间
m + stat_smooth(se = FALSE) + geom_point()

#更改置信区间和线条颜色
m + stat_smooth(fill = "red", size = 2, alpha = 0.5, color = "green") + geom_point()

#用一元一次线性方程拟合
m + stat_smooth(method = "lm") + geom_point()

#使用一元二次方程拟合
m + stat_smooth(method = "lm", formula = y ~ poly(x, 3)) + geom_point()

#按cyl这个离散变量进行分组, 分别拟合数据m <- ggplot(mtcars, aes(y = wt, x = mpg, group = factor(cyl)))
m + stat_smooth(method = lm, aes(color = factor(cyl), fill = factor(cyl))) + geom_point( aes(color = factor(cyl)))


图层(layer)

在上述对数据和映射的讲解中, 已经采用过”+” 来添加图层,可以这样理解 ggplot2 中的图层:每个图层可以代表一个图形组件, 如已经介绍的几何对象、统计变换等图形组件, 这些组件以图层的方式叠加在一起构成一个绘图的整体;在每个图层中的图形组件又可以分别设定数据、映射或其他相关参数, 因此组件之间又是具有相对独立性的。ggplot2 中图层的设定是十分成功的, 因为这一过程是如此实用、方便而富有逻辑性。

在几何对象中设定映射

前面已在 ggplot() 中设定了映射了关系, 这种映射关系是默认的, 我们可以在后面的几何对象中沿用已设定的默认映射关系, 也可以随时在几何对象中进行更改。

#设定默认的映射关系
p <- ggplot(mtcars, aes(x = mpg, y = wt, color = factor(gear)))
#沿用默认的映射关系来绘制散点图
p + geom_point()

#添加图层中的shape的映射关系
p + geom_point(aes(shape = factor(carb)))

#修改默认的y的映射关系, 注意图中y轴名称仍然以默认的wt表示
p + geom_point(aes(y = carb))

#删除默认的color映射关系
p + geom_point(aes(color = NULL))


分面 (facet)

即在一个页面上自动摆放多幅图形, 这一过程先将数据划分为多个子集, 然后将每个子集依次绘制到页面的不同面板中。ggplot2 提供两种分面类型:网格型 (facet_grid) 和封面型 (facet_wrap)网格分面生成的是一个 2 维的面板网格, 面板的行与列通过变量来定义, 本质是 2 维的; 封装分面则先生成一个 1 维的面板条块, 然后再分装到 2 维中, 本质是 1 维的。分面函数如下:

在很多情况下, 我们可能需要绘制有两个 y 轴的坐标系, 而在 ggplot2 中, 这种做法特别不提倡, 可解决的方法要么是把变量归一化, 要么便是采用分面方法。如:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
#以cyl为分类变量
p + facet_grid(. ~ cyl)

#wrap与grid的区别
p + facet_wrap( ~ cyl, nrow = 3)

p + facet_wrap( ~ cyl, ncol = 3)

p <- p + geom_smooth(method = "lm", se =F, aes(color = factor(cyl))) + geom_point(aes(color = factor(cyl)))
p + facet_grid(vs ~ am)


主题 (theme)

主题系统控制着图形中的非数据元素外观, 它不会影响几何对象和标度等数据元素。主题修改是一个对绘图精雕细琢的过程, 主要对标题、坐标轴标签、图例标签文字调整, 以及网格线、背景、轴须的颜色搭配。


标度 (scale)

标度控制着数据到图形属性的映射, 更重要的一点是标度将我们的数据转化为视觉上可以感知的东西, 如大小、颜色、位置和形状。所以通过标度可以修改坐标轴和图例的参数。标度函数如下:

位置函数

坐标系函数

经过以上过程讲述,对 ggplot2 中的图形语法有了基本了解,根据绘制图形的效果可进行相对应的调参。

参考文章:

ggplot2 入门与进阶:http://www.cellyse.com/how_to_use_gggplot2_part1/

R--ggplot2 包介绍学习:http://www.cnblogs.com/nxld/p/6059603.html

入门 ggplot2 的图形语法相关推荐

  1. R语言-ggplot2图形语法

    简介 在R里,主要有两大底层图层系统,一是base图形系统,二是gird图形系统.lattice包与ggplot2包正是基于gird图形系统构建的,他们都有自己独特的图形语法. ggplot2有着自己 ...

  2. R语言实战应用精讲50篇(一)-万字长文干货R语言ggplot2包图形绘制

    前言 ggplot2 包是 Hadly Wickham 开发(除 ggplot2 外,还有 plyr 和 reshape2 包)的一款通过 "+",以图层叠加的搭配组合,易于实现数 ...

  3. r语言ggplot合并图形_R中带有ggplot2的图形

    r语言ggplot合并图形 介绍 (Introduction) R is known to be a really powerful programming language when it come ...

  4. (数据科学学习手札37)ggplot2基本绘图语法介绍

    一.简介 ggplot2是R语言中四大著名绘图框架之一,且因为其极高的参数设置自由度和图像的美学感,即使其绘图速度不是很快,但丝毫不影响其成为R中最受欢迎的绘图框架:ggplot2的作者是现任Rstu ...

  5. ggplot2:图形与艺术笔记

    文章目录 1 qplot()函数 1.1 qplot()的基本用法 1.1.1 散点图 1.2 图形的基本属性 1.3 几何对象 1.3.1 添加平滑曲线 1.3.2 平滑与非平滑的控制 1.4 广义 ...

  6. vue饼图统计_做可交互的统计图表,这套图形语法不容错过

    选好可视化 "一图胜千言",是最直观的数据可视化魅力.以图表来传达和沟通信息,其效率远超枯燥乏味的数据表达. 有需求就有市场.数据可视化崭露头角后,各个厂商出备的产品.解决方案,开 ...

  7. 做可交互的统计图表,这套图形语法不容错过

    选好可视化 "一图胜千言",是最直观的数据可视化魅力.以图表来传达和沟通信息,其效率远超枯燥乏味的数据表达. 有需求就有市场.数据可视化崭露头角后,各个厂商出备的产品.解决方案,开 ...

  8. antv图表 根据屏幕大小响应式_做可交互的统计图表,这套图形语法不容错过

    选好可视化 "一图胜千言",是最直观的数据可视化魅力.以图表来传达和沟通信息,其效率远超枯燥乏味的数据表达. 有需求就有市场.数据可视化崭露头角后,各个厂商出备的产品.解决方案,开 ...

  9. VBA语言入门:一些简单语法在Excel应用实例

    首先,想看详细教程请转向:Excel VBA编程教程 接下来我想介绍一下VBA快速入门最基本的语法. 处理的主函数: Sub fun() ... End Sub 这个语法在c++中可以类比为main, ...

  10. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

最新文章

  1. python 执行vba脚本_用python批量执行VBA代码
  2. php 随机在文章中添加锚文本_seo网站优化技巧之:8种优质锚文本的做法
  3. CCS5.5里DSP工程建及Simulator模式配置
  4. 【AI学院】有三AI博士小姐姐带你学深度学习之图像识别下篇,附上篇回顾
  5. linux服务器出现黄,linux服务器出现严重故障后的原因以及解决方法
  6. c# 常用数据库封装
  7. 孙宇java_[JAVA] 孙宇老师Struts2+Hibernate4+Maven+EasyUI+SpringMvc+Spring+Mybatis+Maven整合课程...
  8. Java中的秒表-StopWatch
  9. Python在SQLite数据库中动态创建数据表的思路与实现
  10. Cache和DMA一致性 iCache和dCache一致性
  11. 马云成名前的一些照片
  12. 基于Arduino的学习、记忆机械手
  13. 链路聚合负载分担方式
  14. 数学建模常见算法:拟合算法
  15. 李宏毅nlp学习笔记10:QA(Question answering)
  16. 【数据挖掘】-决策树算法+代码实现(七)
  17. Retrofit 2.0 超能实践(三),轻松实现多文件/图片上传/Json字符串/表单
  18. c语言常数-ox6a是什么意思,C语言第2讲-数据类型运算符和表达式.pdf
  19. MyBatis-Plus对于大数据量查询,采用分页查询按批次处理结果,通用工具封装
  20. 关于BUCK降压的一些学习笔记3-->最简单的BUCK电路

热门文章

  1. 为什么索引可以让查询变快?终于有人说清楚了!
  2. 本以为用的MyBatis框架就万无一失了,没想到还是被黑客注入了,我真的无语了!...
  3. 为什么Spring MVC能自动转换json/xml,你研究过它背后的原理吗?
  4. 可供创业团队技术开发参考的10条经验
  5. 华为将发布“鸿蒙”以取代 Android 系统
  6. 应对互联网变局,这 8 件事必须要做。
  7. 你真的需要一个微信公众号吗?
  8. ifs 报表开发手册_.NET快速开发框架Colder发布:10 篇热文汇总
  9. python基本执行方式_Python开发的3种命令执行方法
  10. GPU 编程 CPU 异同点_专业软件与CPU的性能相关性详细对比