作者:Li_Yuhui
四川大学研究生在读
本文是R,ggplot2包学习的笔记,总结了大量优秀前辈的工作,对ggplot2进行结构性总结归纳,能够让新手快速上手,事实上,笔者是将其作为字典用的,忘记了,就翻一翻。
看完本文后,如果还是对ggplot2不清楚,欢迎来打脸。
ggplot2特点
- 采用图层的设计方式,有利于结构化思维
- 将表征数据和图形细节分开,能快速将图形表现出来,使创造性绘图更加容易,而不必纠结于图形的细节,细节可以后期慢慢调整
- 将常见的统计变换融入到了绘图中
- 有明确的起始(ggplot开始)与终止(一句话一个图层),图层之间的叠加是靠"+"实现的,越往后,其图层越在上方
- 图形美观,扩展包丰富,有专门调整字体和公式的包,有专门调整颜色的包,还有专门用按钮辅助调整主题的包,总之,应有尽有
ggplot2基本概念
- Data数据, Mapping映射
- Scale标度
- Geometric几何对象
- Statistics统计变换
- Coordinate坐标系统
- Layer图层
- Facet分面
- Legend图例
- beautiful美化
ggplot2语法框架
绘图流程:
ggplot(data, aes(x = , y = )) + # 基础图层,不出现任何图形元素,
geom_xxx()|stat_xxx() + # 几何图层或统计变换,出现图形元素
coord_xxx() + # 坐标变换,默认笛卡尔坐标系
scale_xxx() + # 标度调整,调整具体的标度
facet_xxx() + # 分面,将其中一个变量进行分面变换
guides() + # 图例调整
theme() # 主题系统
共性映射与个性映射
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())
内部
几何对象与统计变换
- 几何对象
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")结果一样
aes与data参数
- aes参数用来指定要映射的变量,可以是多个变量,
- data参数表示指定数据源,必须是data.frame格式,其坐标轴变量最好宽转长,只能指定一个x轴和y轴,多个x列或y列不能使用调整图例。
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'))
柱形图和散点图是关键,并且与极坐标变换紧密相连,着重介绍柱形图和散点图,其它的原理和参数都类似
aesthetics 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等文本对象 |
fill/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
如果对一组颜色进行映射的话,建议使用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种颜色,其颜色色值范围没有变,指定色值间隔减小了