ggplot2
是R语言中最流行的绘图工具包,其风格与基础绘图系统差别很大,且彼此的函数也不能兼容:
通过前面的推文介绍可以看出,基础绘图系统主要是通过一个主函数配合多个辅助函数来完成绘图,各个绘图函数一方面共享来自
par
函数的参数,另一方面又有各自专用的参数;ggplot2
工具包则是将绘图过程分为创建画布和导入数据、绘制图形、设置标度、要素美化等几个独立的任务,每个函数只完成其中一项任务,然后通过+
连接各个类型的函数来完成一幅图形的绘制,具体地,
ggplot
函数:创建绘图画布和导入供全局函数使用的数据集;
geom_*
系列函数:专门的图形绘制函数或导入仅供该函数使用的数据集;
scale_*
系列:专门控制各类要素标度的函数;
theme
函数:专门对各类要素进行美化修饰的函数。
ggplot2
工具包虽然对各类函数采取了统一的命名方式,但相比基础绘图系统,其函数数量还是显得特别庞大,短时间内很难完全掌握。本篇推文目的在于通过一个绘图案例对ggplot2
绘制图形的过程进行一个入门性的介绍。示例数据来自mtcars
数据集:
library(ggplot2)
data <- mtcars
head(data)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
1 ggplot
函数
ggplot
函数主要有两个功能:一是创建绘图画布,代表着绘图的开始;二是导入绘图所需的数据。它有两个参数:
ggplot(data = NULL, mapping = aes())
data:绘图变量所在的数据框;
mapping:绘图所需的变量或其他用于映射的变量。
mapping
参数是通过aes
函数来赋值的,该函数为映射函数,它的参数赋的值只能是数据框中的变量名。
如以wt
变量为横坐标,drat
变量为纵坐标:
ggplot(data = data,
mapping = aes(x = wt, y = drat)) -> p
p

ggplot
函数没有默认的绘制图形;输出图形可以作为对象赋值给变量,并且该变量还可以打印出图形,这是基础绘图系统所不具备的功能。
2 绘制图形的函数
ggplot2
包中专门用于绘制图形的函数均以geom_
开头进行命名,如geom_point
用于绘制散点图、geom_line
绘制折线图,geom_bar
绘制条形图,geom_boxplot
绘制箱型图,还有geom_hline
和geom_vline
分别用于绘制水平和垂直的直线,等等。这些函数的后缀基本上和基础绘图系统相应的函数一致。
以散点图和折线图为例,通过+
可以很便捷地实现不同图形的叠加:
p +
geom_line() +
geom_point()

geom_*
系列的函数能自动继承ggplot
设置的数据框和绘图变量信息;图层叠加的规则是
+
后的函数绘制的图形在+
前的函数绘制的图形之上。
geom_*
函数也可以自定义自己所需的绘图变量:
p +
geom_line() +
geom_point(aes(x = wt, y = mpg))

需要注意的是,
geom_*
系列函数的第一个参数是mapping
,第二个参数是data
,和ggplot
函数是相反的。
在该类函数内可以通过一些参数对图形要素进行美化:
p +
geom_line(linetype = 2, size = 1.2, col = "blue") +
geom_point(shape = 21, size = 3, col = "red", fill = "blue")

还可以通过某个变量对要素进行分组美化,需要使用映射函数aes
,如通过cyl
变量进行分组:
data$cyl = factor(data$cyl)
p <- ggplot(data, aes(wt, drat))
p +
geom_line(aes(col = cyl, linetype = cyl), size = 1.2) +
geom_point(aes(shape = cyl), size = 3, col = "red",
fill = "blue", alpha = 0.5)

分组变量的数据类型需要是因子类型;
修改后的数据框需要重新赋值给
ggplot
函数的参数。
使用映射函数对要素进行分组美化是ggplot2
的一大特色,如果使用基础绘图系统的绘制思路会很繁琐,仅以折线图为例:
p +
geom_line(data = data[data$cyl == 4,], size = 1.2, linetype = 2, col = "red") +
geom_line(data = data[data$cyl == 6,], size = 1.2, linetype = 3, col = "blue") +
geom_line(data = data[data$cyl == 8,], size = 1.2, linetype = 4, col = "green")

如果觉得使用折线图不能很好地反映变化趋势,可以使用geom_smooth
函数绘制平滑曲线:
p +
geom_point(aes(shape = cyl, col = cyl), size = 3,
fill = "blue", alpha = 0.5) +
geom_smooth(aes(col = cyl), method = lm) -> p2
p2

geom_smooth
默认的平滑方法是loess,通过method
和formula
等参数可以进行修改。
使用facet_*
函数可以分组绘制子图:
p +
geom_line(linetype = 2, size = 0.8, col = "blue") +
geom_point(shape = 21, size = 3, col = "red", fill = "blue") +
facet_wrap(~ cyl, scales = "free")

3 标签函数
xlab
、ylab
、ggtitle
和labs
等函数可以添加图形标签:
xlab
和ylab
只有label
一个参数,用于添加横、纵坐标的标签;ggtitle
函数用于添加图形标题;labs
函数是全能的标签函数。
p2 +
xlab("wt(mtcars)") +
ggtitle(label = "drat ~ wt") +
labs(y = "drat(mtcars)", caption = "R语言学堂") +
ylim(2, 5.5) -> p3
p3

4 标度函数
标度函数主要用于控制各类要素的属性,该类函数一般采取三级命名方法,之间使用下划线隔开,其中第一级均为scale
,第二级有如下几种:
scale_alpha_*:透明度标度;
scale_color_*:颜色标度
scale_fill_*:填充颜色标度;
scale_linetype_*:线型标度;
scale_shape_*:点的形状标度;
scale_size_*:点的大小和线的粗细标度;
scale_x_*:横坐标轴标度;
sclae_y_*:纵坐标轴标度。
该类函数是ggplot2
包中最复杂的一类函数。前文使用cyl
变量将散点的颜色分为三组,这里使用scale_color_manual
函数手动指定每组的颜色,使用scale_x_continuous
调整横坐标轴的刻度:
p3 +
scale_color_manual(values = c("red", "blue", "green")) +
scale_x_continuous(breaks = seq(1.5, 5.5, 0.5)) -> p4
p4

5 theme
函数
theme
函数用于对图形要素进行美化,它拥有丰富的参数,命名方式也是遵循逐级命名的规则:
theme(
line,
rect,
text,
title,
aspect.ratio,
axis.title, axis.title.x, axis.title.x.top, ...,
legend.background, legend.margin, legend.spacing, ...,
panel.background, panel.border, panel.spacing,...,
plot.background, plot.title, plot.title.position, ...,
strip.background, strip.background.x, strip.background.y, ...,
...,
complete = FALSE,
validate = TRUE
)
该函数参数较多,这里每类只列举前三个,其余使用省略号表示。
theme
函数是如何通过一个参数就对某个要素的颜色、形状、大小等诸多属性进行设置的呢?其实它是使用element_*
系列函数进行赋值的,而该类函数又包含若干参数:
element_*
系列主要包含四个函数,除element_blank
外,其余三个分别针对线状、矩形和文本类要素进行设置:
element_blank: draws nothing, and assigns no space.
如将绘图背景设置为空白:
theme(panel.background = element_blank())
element_line: lines.
element_line(
colour = NULL,
size = NULL,
linetype = NULL,
lineend = NULL,
color = NULL,
arrow = NULL,
inherit.blank = FALSE
)
如将横坐标轴的刻度线设置为红色:
theme(axis.ticks.x = element_line(colour = "red"))
element_rect: borders and backgrounds.
element_rect(
fill = NULL,
colour = NULL,
size = NULL,
linetype = NULL,
color = NULL,
inherit.blank = FALSE
)
如对图形的背景边框进行调整:
theme(panel.border = element_rect(fill = NA, size = 0.3))
element_text: text.
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
)
如对横坐标的标签进行调整:
theme(axis.text.x = element_text(size = 10))
p4 +
theme( axis.line = element_line(color = "black", size = 0.2),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
axis.ticks = element_line(colour = "grey"),
legend.position = "right",
legend.direction = "vertical",
panel.background = element_blank(),
panel.border = element_rect(fill = NA, size = 0.3),
panel.grid.major = element_line(linetype = 2, colour = "grey", size = 0.5),
plot.title = element_text(size = 12, hjust = 0.5)) -> p5
p5

6 保存图形到本地
ggplot2
工具包输出图形的函数是ggsave
,该函数重要的参数有以下四个:
filename:保存地址和文件名;
width和height:输出图形尺寸;
dpi:输出图片分辨率。
默认保存最后一幅由ggplot2
语法绘制的图形:
ggsave(filename = "G:/ggplot.jpeg",
width = 8, height = 5, dpi = 600)
也可以指定保存已经命名的图形对象:
ggsave(p4, filename = "G:/ggplot2.jpeg",
width = 8, height = 5, dpi = 600)
最后附上一幅ggplot2
函数的参数清单图: