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. Spring 中出现Element : property Bean definitions can have zero or more properties. Property elements correspond to JavaBean setter methods exposed by the bean classes. Spring supports primitives, refer

    在这个ApplicationContext.xml文件中出现 如下报错 Element : property Bean definitions can have zero or more proper ...

  2. Log4j与Log4j2

    完整的软件,日志是必不可少的.程序从开发.测试.维护.运行等环节,都需要向控制台或文件等位置输出大量信息.这些信息的输出,在很多时候是System.out.println()无法完成日志信息根据用途与 ...

  3. 《android开发进阶从小工到专家》读书笔记--HTTP网络请求

    No1: 客户端与服务器的交互流程: 1)客户端执行网络请求,从URL中解析出服务器的主机名 2)将服务器的主机名转换成服务器的IP地址 3)将端口号从URL中解析出来 4)建立一条从客户端与Web服 ...

  4. freemaker中的map遍历

    前两天在freemaker中遇到一个问题,怎么遍历一个Map<List<Object>的map呢? 网上找个很多都是类似下面的: <#if map?exists> < ...

  5. 在linux系统中

    A .etc下放置配置文件 B./var下放置日志文件 C./root超级用户主目录 D./home 使用者家目录 /bin  二进制执行文件,也就是命令文件 /etc 下存放的是配置文件 /dev ...

  6. bootstrap模态对话框

    bootstrap模态对话框 前提是引入bootstrap的css和js的东西 data-backdrop="static"代表的是点击旁边的内容,不进行关闭操作,但是esc的时候 ...

  7. java程序中执行HiveQL

    这里是指java中执行hive或者hiveQL. 注意:而不是经常说的通过JDBC的方式连接Hiveserver2来执行查询.是在部署了hiveserver的服务器上执行hive命令.这样就可以将分析 ...

  8. java并发编程笔记3-同步容器&并发容器&闭锁&栅栏&信号量

    一.同步容器: 1.Vector容器实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施.保证了线程 ...

  9. linux iptables配置

    防火墙硬件防火墙软件防火墙: 应用层防火墙 网络层防火墙:linux包过滤防火墙linux包过滤防火墙netfilter:位于linux内核中的包过滤功能体系,称为linux防火墙的"内核态 ...

  10. windowsXP下搭建JAVA环境教程

    一.工具准备安装JKD6:传送门:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-w ...