作者: 李誉辉
四川大学在读研究生
1 ggplot2特点采用 图层 的设计方式,有利于结构化思维
将表征数据和图形细节分开,能快速将图形表现出来,使创造性绘图更加容易,而不必纠结于图形的细节,细节可以后期慢慢调整
将常见的统计变换融入到了绘图中
有明确的起始(ggplot开始)与终止(一句话一个图层),图层之间的叠加是靠“+”实现的,越往后,其图层越在上方
图形美观,扩展包丰富,有专门调整字体和公式的包,有专门调整颜色的包,还有专门用按钮辅助调整主题的包,总之,应有尽有
2ggplot2基本概念Data数据, Mapping映射
Scale标度
Geometric几何对象
Statistics统计变换
Coordinate坐标系统
Layer图层
Facet分面
Legend图例
beautiful美化
3ggplot2语法框架绘图流程: ggplot(data, aes(x = , y = )) + # 基础图层,不出现任何图形元素, geom_xxx()|stat_xxx() + # 几何图层或统计变换,出现图形元素 coord_xxx() + # 坐标变换,默认笛卡尔坐标系 scale_xxx() + # 标度调整,调整具体的标度 facet_xxx() + # 分面,将其中一个变量进行分面变换 guides() + # 图例调整 theme() # 主题系统
3.1共性映射与个性映射
ggplot(data = NULL, mapping = aes())
geom_xxx(data = NULL, mapping = aes())
ggplot() 内有data、mapping两个参数
具有全局优先级,可以被之后的所有 geom_xxx 对象或 stat_xxx() 所继承(前提是 geom 或 stat 未指定相关参数)
而 geom_xxx() 或 stat_xxx() 内的参数属于局部参数,仅仅作用于内部
为了避免混乱,通常将共性映射的参数指定在 ggplot(aes()) aes内部,将个性映射的参数指定在 geom_xxx(aes()) 或 stat_xxx(aes()) 内部
3.2几何对象与统计变换
几何对象 geom_xxx(stat = ) 内有统计变换参数 stat ,统计变换 stat_xxx(geom = ) 内也有几何对象参数 geom
两种方法结果相同,几何对象更专注于结果,统计变换更专注于变换过程
library(ggplot2) # 用几何对象作图 ggplot(data = NULL, mapping = aes(x = x, y = y)) + geom_point(color = "darked", stat = "identity") # identity 表示没有任何统计变换 # 用统计变换作图 ggplot(data = NULL, mapping = aes(x = x, y = y)) + stat_identity(color = "darked", geom = "point") # geom_point(stat = 'identity')与stat_identity(geom = 'point')结果一样3.3aes与data参数
aes参数用来指定要映射的变量,可以是多个变量,
data参数表示指定数据源,必须是data.frame格式,其坐标轴变量最好宽转长,只能指定一个x轴和y轴,多个x列或y列不能使用调整图例。
4 geom_xxx() 几何对象常用的几种几何对象函数:
几何对象函数描述其它
geom_point点图geom_point(position = "jitter")==geom_jitter()避免重叠
geom_line折线图可以通过smooth参数平滑处理
geom_bar柱形图x轴是离散变量
geom_area面积图
geom_histogram直方图x轴数据是连续的
geom_boxplot箱线图
geom_rect二维长方形图
geom_segment线段图
geom_path几何路径由一组点按顺序连接
geom_curve曲线
geom_abline斜线有斜率和截距指定
geom_hline水平线常用于坐标轴绘制
geom_vline竖线常用于坐标轴绘制
geom_text文本
ggplot2唯一不支持的常规平面图形是 雷达图
其它几何对象查询:
ggplot2 part of the tidyverse
ggplot2 Quick Reference: geom
也可以用
ls(pattern = '^geom_', env = as.environment('package:ggplot2')) 查询,但是没有图形示例
library(ggplot2) ls(pattern = "^geom_", env = as.environment("package:ggplot2"))柱形图和散点图是关键,并且与极坐标变换紧密相连,着重介绍柱形图和散点图,其它的原理和参数都类似
4.1aesthetics specifications 美学参数
能用作变量 映射 的包括:
美学参数描述
color/col/colour指定点、线和填充区域边界的颜色
fill指定填充区域的颜色,如条形和密度区域, 第21到24号点也有填充色
alpha指定颜色的透明度,从0(完全透明) 到 1(不透明)
size指定点的尺寸或线的宽度,单位为mm
angle角度,只有部分几何对象有,如geom_text文本的摆放角度, geom_spoke中短棒摆放角度
linetype指定线条的类型
shape点的形状, 为[0, 25]区间的26个整数vjust垂直位置微调,在(0, 1)区间的数字或位置字符串: 0=“buttom”, 0.5=“middle”, 1=“top” , 区间外的数字微调比例控制不均
hjust水平位置微调,在(0, 1)区间的数字或位置字符串:0=“left”, 0.5=“center”, 1=“right” , 区间外的数字微调比例控制不均
不常映射的参数描述
binwidth直方图的宽度
notch表示方块图是否应为缺口
sides表示地毯图的安置位置(“b”底部, “l”左部, “t”顶部, “r”右部, “bl”左下角, 等等)
width箱线图或柱形图的宽度,从(0, 1), 柱形图默认0.9即90%
lineend表示指定宽线条端部形状,有3种:“round”半圆形,“square”增加方形, “butt”默认不变, 常用于geom_path和geom_line几何对象
family字体(Font face),内置的只有3种:“sans”, “serif”, “mono”
fontface字型,分为: “plain”常规体, “bold”粗体, “italic”斜体, “bold.italic”粗斜体。常用于geom_text等文本对象
lineheight长文本换行行距, 常用于geom_text等文本对象
4.1.1fill/color 颜色
R自身自持很多种方式的颜色,“颜色名称”和“HEX色值”最常用和方便,其它的需要扩展包
颜色名称如:
“white”, “azure”, “bisque”, “blue”, “black”, “brown”, “chacolate”, “coral”, “cornsilk”, “cyan”, “gold” ,
“darkgolden”, “orange”, “orchild”, “gray”, “grey”, “tomato”, “violet”, “wheat”, “yellow”, “pink”,
“purple”, “red”, “salmon”, “seashell”, “ivory”,“magentia”,“navy”等系列。
所有的颜色名称见: R_Color_Chart (后台回复: 颜色 ,可下载PDF版本)
如果对一组颜色进行映射的话,建议使用RColorBrewer等调色包,更加方便
RColorBrewer颜色板如下,左边为字符串编号,上下分为3个版块,分别为渐变色板Sequential,离散对比色板Qualitative,两极色板Diverging
# colors() # 调用所有内置颜色编号,名称 scales::show_col(colors()[1:6]) # show_col函数可以将颜色名称或HEX色值向量显示出来 # RColorBrewer包使用 library("RColorBrewer") display.brewer.all() # 显示所有可用色板 display.brewer.all(type = "seq") # 查看渐变色板RColorBrewer使用方法:
通过函数 brewer.pal(n, name) 抽取色条名字为name的n种颜色,后面还可以用“[]”索引符号索取色块,一个几何对象设置多种颜色只能在标度中设置,我们会在标度中继续讲解,例:
library("RColorBrewer") display.brewer.pal(7, "PuRd") # 抽取PuRd色条7种颜色,其颜色色值范围没有变,只是色值间隔增大了 display.brewer.pal(9, "PuRd")[11] # 抽取PuRd色条11种颜色,其颜色色值范围没有变,指定色值间隔减小了4.1.2linetype 线型
线条形状通过名称或整数指定:
线型描述
0=“blank”白线
1=“solid”实线
2=“dashed”短虚线
3=“dotted”点线
4=“dotdash”点横线
5=“longdash”长虚线
6=“twodash”短长虚线
自定义线型
通过1个十六进制的字符串来自定义,字符串长度为2、4、6或8。
第1个数字为代表闭合的长度,第2个数字代表缺口的长度,第3个数字又是闭合的长度,第4个数字是缺口的长度,如此交替排列。 然后作为一个整体重复排列
如:
* 字符串“33”代表开始3个单位长度闭合,产生短横线,然后缺口长度也是3个单位,这样作为一个整体进行重复排列
* 字符串“81”代表开始8个单位长度闭合,产生较长的横线,然后缺口长度为1个单位,这样作为一个整体重复排列
* 字符串“f8”表示开始16个单位长度闭合,产生长横线,然后缺口长度为8个单位,这样作为一个整体重复排列
* 字符串“357a”表示开始3个单位长度闭合,产生短横线,然后缺口5个单位,然后闭合7个单位,最后缺口11个单位,这样整体重复排列
如图所示:
library(ggplot2) lty <- c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash") linetypes <- data.frame( y = seq_along(lty), # seq_along表示生成与对象同样长度的序列 lty = lty ) ggplot(linetypes, aes(0, y)) + geom_segment(aes(xend = 5, yend = y, linetype = lty)) + # 将一个变量映射到线型 scale_linetype_identity() + geom_text(aes(label = lty), hjust = 0, nudge_y = 0.2) + scale_x_continuous(NULL, breaks = NULL) + scale_y_reverse(NULL, breaks = NULL) # 自定义线型 lty <- c("33", "18", "81", "f8", "5f", "357a", "5a73", "342167", "a23f45b6") # 自定义9种线型