1 前言
ggplot2是数据可视化的重要程序包,用于绘制各种高级统计图形。该程序包是新西兰统计学家Hadley Wickham在2005年左右开发的,那时候作者还是美国Iowa大学的博士生。
1.1 ggplot2的命令是一种用R实现的绘图语言
ggplot2的代码相对容易理解,设定各种参数较为方便,图形也十分美观,能用相对简单的代码在图形中呈现出非常丰富的信息。不过,ggplot2的语法与传统R函数的调用方式有很大差别,所以不少人反映学起来有些困难。
在ggplot2出现以前,R绘图都是调用函数,再通过改变函数的参数实现的。ggplot2将所绘制图形的各部分独立出来,如xy坐标,基本组件的颜色、图标大小、填充类型、堆叠方式、坐标轴、地图投影、数据分组、图形分面等等信息划归为一些基本类型,每一部分分别用一段代码表示。每段代码内部有相应的参数控制,各代码段再通过“+”运算符连接。这里的“+”并非四则运算的加法,而是表示图形各要素/组件之间的叠加。“+”运算符所连接的代码片段,有任何一部分做出更改,整个图形就做出相应调整。因此,本质上,ggplot2代码是用R语言实现的一种绘图语言。
ggplot2所用的绘图语言,主要是按照Wilkinson(2005)的设想实现的。Wilkinson(2005)将一幅统计图形看做由以下几个主要部分:
数据;
表现数据的点、线、多边形、栅格、颜色等;
坐标系
1.2 ggplot2命令的基本组成
具体来讲,在ggplot2程序包中,每一副图都是由若干组件组成的,这些组件包括:
data
: 数据,必须为data.frame。coordinate system
: 数据可视化,主要是在二维平面上表示数据的关系,所用坐标系一般为平面直角坐标,有时会用到极坐标、地图投影等。ggplot2软件默认使用平面直角坐标。geoms
: 包括geoms_开头的各种对象,用来绘制各种基本组件,包括点、线、面、多边形、柱状图、箱线图等。aesthetics
: 图形的美学特征,如颜色、形状、透明度、大小、分组等。scales
: 坐标轴的属性stats
: 统计变换。用于设定数据要进行的统计转换,例如平均值、中位数、记录数等。facets
: 描述如何将图形按照某一个或者几个因子(factors)不同水平(levels)用多个图形分开展示。
1.3 ggplot2要求输入数据为data.frame
ggplot2要求输入的数据为data.frame。为了将R中的各种数据转换为ggplot2能够读取和操作的data.frame格式,H. Wickham还开发了reshape2以及dplyr等程序包,专门用于数据转换。
1.4 ggplot2中的aes函数
完整的ggplot2绘图命令, 总是以ggplot()
开始。ggplot()及其参数奠定整个ggplot2图形的基础,最重要的两个参数为data和mapping。其中data必须为data.frame格式。mapping参数要求数据通过aes函数进一步转换。aes是aesthetic的缩写。在aes函数中,要输入的参数有x, y, group, color, size等。aes可以直接访问data参数所输入数据框的各列,从而直接控制图形的横坐标、纵坐标、分组以及各组的颜色、大小、透明度等等。
注意:在ggplot()代码部分设置的aes参数对于整个图形都有效。在某个geom组件内部设置的aes参数,如颜色、分组、字体大小、线段类型等,只对该geom组件有效。若要设定所有geom组件的形状、大小、颜色等,相应的参数如size, color等,不要放入aes函数转换,而是作为ggplot()函数的普通参数即可。
1.5 ggplot2的geom组件
ggplot()代码段只定义数据展示的逻辑关系,并不直接绘图。要用ggplot2绘图,还必须为其添加各种基本图形组件。要添加的图形组件根据变量的数目以及要绘制的图形有所不同,包括:点geom_point、线geom_line、多边形geom_polygon、箱线图geom_boxplot、柱状图geom_bar、六角形图geom_hex、栅格图geom_tile、阶梯线geom_step、拟合的趋势线geom_smooth等等。
为了对图形进行进一步修饰,还可能要更改图形的横坐标、纵坐标、标题等等。
1.6 ggplot2图形的显示
ggplot2所生成的对象,同时具有gg和ggplot两种属性。如果要显示图形,需要将其print到屏幕上,而不是像plot()函数一样直接调用函数就可以调用绘图设备(屏幕也是绘图设备)。与此同时,ggplot2的图形也不接受par()设定的各种参数。
本文就ggplot2的常用绘图组件做简要介绍。
2 快速绘图
2.1 qplot (不建议使用)
为了让只熟悉R基础绘图的用户也能使用ggplot2,H. Wickham编写了qplot函数,调用方式类似plot()。在qplot()中,所有控制图形的信息都封装为参数。但是qplot()在一定程度上降低了绘图的灵活性,难以体现ggplot2的优势,因此不太建议使用。
#### 载入数据
library(maps)
library(ggthemes)
library(ggplot2)
2.1.1 普通绘图
plot(hwy ~ cty, data = mpg)
2.1.2 qplot绘图
qplot(x = cty, y = hwy, color = cyl, data = mpg, geom = "point")
2.1.3 ggplot2绘图
ggplot(data = mpg, aes(x = cty, y = hwy)) + ### 设置x, y以及数据
geom_point(aes(color = cyl)) + ### 添加 点, 以及 设置 点 的颜色
geom_smooth(method = "lm") + ### 添加拟合曲线/曲线以及置信区间
coord_cartesian() + ### 笛卡尔坐标系, 即平面直角坐标系
scale_color_gradient() + ### 图例的颜色
theme_base() + ### 主题为base风格
scale_shape(solid = FALSE) + ### 点的类型为中空。
ggtitle("New Plot Title") + ### 标题
xlab("New X label") + ### 横轴
ylab("New Y label") ### 纵轴
3 基本绘图组件及其属性
3.1 多边形
thismap = map_data("world")
c c + geom_polygon(fill="white", colour="gray")
3.2 折线图
ggplot(economics, aes(date, unemploy)) +
geom_path(lineend = "butt", linejoin = "round", linemitre = 1)
3.3 带状图
ggplot(economics, aes(date, unemploy)) +
geom_ribbon(aes(ymin = unemploy - 900, ymax = unemploy + 900))
3.4 线段
ggplot(seals, aes(x = long, y = lat)) +
geom_segment(aes(xend = long + delta_long, yend = lat + delta_lat))
3.5 长方形
ggplot(seals, aes(x = long, y = lat)) +
geom_rect(aes(xmin = long, ymin = lat, xmax = long + delta_long, ymax = lat + delta_lat))
4 一维连续数据(向量)绘图
4.1 一维连续数据
a
4.2 频度阴影图
a + geom_area(stat = "bin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
4.3 核密度图
a + geom_density(kernel = "gaussian")
4.4 点状频度图
a + geom_dotplot()
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.
4.5 频度折线图
a + geom_freqpoly()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
4.6 单变量离散数据
b b + geom_bar()