ggplot2图形系统的核心理念是把绘图与数据分离,把数据相关的绘图与数据无关的绘图分离,按图层作图。ggplot2可以把绘图拆分成多个图层,且能够按照顺序创建多重图形。

使用ggplot2包创建图形时,每个图形都是由函数ggplot()创建的,提供绘图的数据和映射:

  • 数据(data):数据框对象
  • 映射(mapping):由aes()函数来设置映射

由几何对象来控制绘制的几何图形,通过符号“+”来增加图形的元素,这使得绘制图形的过程结构化,同时使绘图更具灵活性。

在ggplot2中, 图形语法中至少包括了如下几个图形部件,每一个部件可以是一个图层:

  • 几何对象(geom)
  • 统计变换(stats)
  • 标度(scale)
  • 坐标系(coord)
  • 分面(facet)
  • 主题(theme)

这些组件之间是通过“+”, 以图层(layer)的方式来粘合构图的,可以这样理解ggplot2中的图层:每个图层可以代表一个图形组件, 这些图形组件以图层的方式叠加在一起构成一个绘图的整体,在每个图层中的图形组件又可以分别设定数据、映射或其他相关参数,因此组件之间又是具有相对独立性的。

在开始正文之前,推荐大家阅读《ggplot2入门与进阶(上)》,这篇文章写的非常好。

一,数据和映射

使用函数ggplot()初始化图形对象,并指定绘制图形的数据集和坐标轴的映射,在ggplot()函数中,指定数据集的默认设置,便于后续图形选项的操作:

ggplot(data = NULL, mapping = aes())

两个重要参数:

  • data: 用于指定要用到的数据源,必须使数据框类型
  • mapping:使用aes()函数指定每个变量的角色,除x和y之外的其他参数,例如,size、color、shape等,必须采用name=value的形式。

在ggplot中设置的映射是默认映射关系,其他图层中可以继承该映射关系,或修改映射关系。

1,数据

在ggplot2中, 所接受的数据集必须为数据框(data.frame)格式,在下面的小节中,使用数据集mtcars作为ggplot的输入:

library(ggplot2)
data("mtcars")

2,映射

映射是指为数据集中的数据关联到相应的图形属性过程中一种对应关系,ggplot2通过aes()函数来指定映射,把图形属性和数据关联起来。

aes是英语单词 aesthetics 的缩写,中文意思是美学,aes用于指定图形属性。

aes(x, y, ...)

aes()函数中常见的映射选项是:

  • x和y:用于指定x轴和y轴映射的变量
  • color:映射点或线的颜色
  • fill:映射填充区域的颜色
  • linetype:映射图形的线形(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号)
  • size:点的尺寸和线的宽度
  • shape:映射点的形状

  • group:默认情况下ggplot2把所有观测点分为了一组, 如果需要把观测点按额外的离散变量进行分组处理, 必须修改默认的分组设置

注意,映射和设定是不同的:

  • 映射是将一个变量中离散或连续的数据与一个图形属性中以不同的参数来相互关联,
  • 设定能够将这个变量中所有的数据统一为一个图形属性。
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(color = "blue") #设定散点的颜色为蓝色
p + geom_point(aes( color = "blue"))

最后一行语句为错误的映射关系, 在aes中, color = “blue”的实际意思是把”blue”当为一个变量, 用这个变量里的数据去关联图形属性中的参数, 因为”blue”只含有一个字符变量, 默认情况下为离散变量, 按默认的颜色标度标记为桃红色。

3,分组

分组(group)是ggplot2中映射关系的一种,默认情况下ggplot2把所有观测点分为了一组,如果需要把观测点按指定的因子进行分组处理,必须修改默认的分组设置。

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

分组也可以通过映射把视觉特征(shape、color、fill、size和linetype等)设置为变量来实现分组,分组通常使用因子来实现,这就要求在数据集中存在因子变量,用于对数据分类,实现图形的分组。

ggplot(data=ds,aes(x=var1,y=var2,fill=var3,shape=var4))+
geom_point()

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

几何对象控制图层的渲染和生成的图像类型,例如,geom_point()会生成散点图,而geom_line会生成折线图。统计变换是对数据进行统计,通常以某种方式对数据信息进行汇总, 例如通过stat_smooth()添加光滑曲线。
每一个几何对象都有一个默认的统计变换, 并且每一个统计变换都有一个默认的几何对象。在ggplot2的官方文档中, 已对ggplot2中所有的geom和stat组件进行了汇总, 更详细的内容, 可直接点开相应图形组件所对应的链接。

函数ggplot()可以设置图形,但是没有视觉输出,需要使用一个或多个几何函数向图形中添加几何对象(geometric,简写为geom),包括点(point)、线(line)、条(bar)等,而添加几何图形的格式十分简单,通过符号“+”把几何图形添加到plot中:

ggplot()+
geom_xxx()

例如,使用geom_point()函数输出点状图形,并接收以下美学参数:alpha、colour、fill、group、shape、size和stroke,

ggplot(data=mtcars, aes(x=wt,y=mpg))+
geom_point(color="red",size=,shape=)

常用的图形参数是:

  • color:对点、线和填充区域的边界进行着色
  • fill:对填充区域着色
  • alpha:演示的透明度,从透明(0)到不透明(1)
  • linetype:图案的线条(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号)
  • size:点的尺寸和线的宽度
  • shape:点的形状(和par()函数的pch参数相同)

  • position:绘制条形图和点等对象的位置
  • binwidth:分箱的宽度
  • notch:表示方块图是否应该有缺口
  • sides:地毯图的位置("b"=底部、"l"=左部、"r"=右部、"bl"=左下部,等)
  • width:箱线图的宽度

三,标度(scale)

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

最常用的标度是:标签、图形选项(颜色、size、形状、线形等)和坐标轴

1,标签

可以通过函数labs()来指定图形的标题(title),子标题(subtitle),坐标轴的标签(x,y)等,并可以指定标签的美学选项:

labs(...)

参数是美学(aesthetic)选项,使用name=value模式,可以使用的选项是:

  • 指定文字:title、subtitle、caption、x和y
  • 指定美学选项:color、size等

2,自定义图形选项

scale_colour_manual()
scale_fill_manual()
scale_size_manual()
scale_shape_manual()
scale_linetype_manual()
scale_alpha_manual()
scale_discrete_manual()

3,坐标轴

标度是区分离散和连续变量的,标度用于将连续型、离散型和日期-时间型变量映射到绘图区域,以及构造对应的坐标轴。

四,坐标系

坐标系统确定x和y美学如何组合以在图中定位元素。默认的坐标系是笛卡尔坐标系,coord_cartesian(),笛卡尔坐标系是最常用的坐标系,函数coord_flip() 用于反转笛卡尔坐标系,把x轴和y轴对调。

五,刻面(facet)

分组和刻面都用于对数据分组,便于观察各自的规律、趋势和模式,不同的是,分组是把图形绘制到一个大的图形中,通过美学特征来区分,而刻面是把图形绘制到不同的网格中。

刻面是在一个画布上分布多幅图形,这一过程需要先把数据划分为多个子集, 然后把每个子集依次绘制到画布的不同面板中。

ggplot2提供两种分面类型:网格型(facet_grid)封面型(facet_wrap)

  • 网格刻面生成的是一个2维的面板网格, 面板的行与列通过变量来定义, 本质是2维的;
  • 封装刻面则先生成一个1维的面板条块, 然后再分装到2维中, 本质是1维的。

六,主题

主题(Theme)用于控制图形中的非数据元素外观,不会影响几何对象和标度等数据元素,主题主要是对标题、坐标轴标签、图例标签文字调整, 以及网格线、背景、轴须的颜色搭配。

ggplot图形的主题(theme)元素主要分为5大类:图形(plot)、面板(panel)、坐标轴(axis)、图例(Legend)和带形(Strip),通过theme()函数来统一控制图形的美学和文本特征,可以用于调整字体,背景色,前景色和网格线等。

对于面板的网格线,分为主线(panel.grid.major)和 次线(panel.grid.minor ),用户可以根据绘制图形的需要,显示或隐藏。

关于主题的详细用法,请查看官方文档:Modify components of a theme 和 Theme elements

Theme()中每一个参数的赋值,可以通过元素函数来实现,margin()函数用于指定元素的边界,element_xxx用于控制矩形,线条和文本的填充(fill)、颜色,size、形状等

margin(t = 0, r = 0, b = 0, l = 0, unit = "pt")
element_blank()
element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL, inherit.blank = FALSE)
element_line(colour = NULL, size = NULL, linetype = NULL, lineend = NULL, color = NULL, arrow = NULL, inherit.blank = FALSE)
element_text(family = NULL, face = NULL, colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, color = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE)

参考文档:

Aesthetic specifications

ggplot2 Reference

R实战 第五篇:绘图(ggplot2)的更多相关文章

  1. R实战 第三篇:数据处理(基础)

    数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...

  2. R实战 第七篇:网格(grid)

    grid包是R底层的图形系统,可以绘制几乎所有的图形.除了绘制图形之外,grid包还能对图形进行布局.在绘图时,有时候会遇到这样一种情景,客户想把多个代表不同KPI的图形分布到同一个画布(Page)上 ...

  3. R实战 第七篇:绘图文本表

    文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...

  4. SpringCloud实战 | 第五篇:SpringCloud整合OpenFeign实现微服务之间的调用

    一. 前言 微服务实战系列是基于开源微服务项目 有来商城youlai-mall 版本升级为背景来开展的,本篇则是讲述SpringCloud整合OpenFeign实现微服务之间的相互调用,有兴趣的朋友可 ...

  5. R实战 第三篇:数据处理

    在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量.数据处理通常包括增加新的变量.处理缺失值.类型转换.数据排序.数据集的合并和获取子集等. 一,增加新的变量 通常需要 ...

  6. R实战 第十一篇:处理缺失值

    在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...

  7. R实战 第六篇:数据变换(aggregate+dplyr)

    数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...

  8. R实战 第八篇:重塑数据(reshape2)

    数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...

  9. R实战 第十篇:列联表和频数表

    列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表.交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系. 按两个变 ...

随机推荐

  1. jdbc 报错解决办法

    刚刚看到一个童鞋出现了这个问题 其实这个问题很好解决 在工程中创建一个lib目录: 然后讲mysql包复制进去 然后对着包点击右键 build path就可以了 最后面再次运行就可以了 jar包地址下 ...

  2. Ubuntu14.04上安装Composer

    1,查看机子上有没有安装php 2,下载Composer的安装包 3,安装Composer 4,设置Composer全局可访问

  3. Yii的URL助手

    Url 帮助类 获得通用 URL 记住 URLs 检查相对 URLs Url 帮助类提供一系列的静态方法来帮助管理 URL. 获得通用 URL 有两种获取通用 URLS 的方法 :当前请求的 home ...

  4. hihoCoder 1493 : 歌德巴赫猜想 素数筛法

    题意:哥德巴赫猜想认为"每一个大于2的偶数,都能表示成两个质数之和".给定一个大于2的偶数N,你能找到两个质数P和Q满足P<=Q并且P+Q=N吗?如果有多组解,输出P最小的一 ...

  5. JavaScript网页全屏API

    在大多数的浏览器中都有实现网页全屏显示的功能,并且大部分浏览器实现全屏显示和退出全屏显示的快捷键通常是F11和Esc两个按键.如今,W3C已经制定了关于网页全屏显示的API,利用这个API 可以实现网 ...

  6. Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  7. 2.5 非透明PCI桥

    PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片.通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地 ...

  8. Srtuts2实现登录界面(不连接数据库)

    1.设计思路 (1)利用Struts2框架设计出一个登录页面的跳转,当用户名和密码都正确时, 跳到登录成功页面:否则,跳到登录失败页面,并在10秒钟内跳到登录界面: (2)在Action中判断用户名和 ...

  9. eclipse中添加Java代码注释模板

    eclipse中添加Java代码注释模板 1.Window->Preference->Java->Code Style->Code Template,进入注释编辑界面 2.文件 ...

  10. Hidden Markov Models(HMM) 初理解

    1. 一个简单例子