由ggplot2所制得图形有三个重要的组成部分
1. 数据
2. 数据和视觉变量属性之间的映射(aesthetic mappings)
3. 呈现数据结果的图层(一般使用geom()
函数)
举例
绘制displ和hwy相关性的散点图,脚本如下:
library(ggplot2)
mpg ## 加载数据集
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point()
相应的,ggplot2参数中mpg是数据集,映射即x、y坐标轴对应的数据,图层是散点图。
注意该函数调用的结构,第一排包括数据集和映射aes()
,放在ggplot()
中,然后再通过 +
添加图层 geom_point()
(散点图)
运行脚本后生成图片:
另外,aes()
中的前两个参数默认为x,y轴的映射,因此脚本也可简写为:
library(ggplot2)
mpg
ggplot(mpg, aes(displ, hwy)) +
geom_point()
利用图形属性(颜色和形状)可以来比较不同分组)。
图形的颜色、大小和形状等都是给绘图添加的额外变量,即标度(scale),添加在函数aes()
的参数中,如下(注:class、drv、cyl等是数据集中的类别名称):
- aes(displ, hwy, colour = class)
- aes(displ, hwy, shape = drv)
- aes(displ, hwy, size = cyl)
因此,在图1的基础上,增加一个颜色参数,将class变量映射成不同的颜色,并创建图例,脚本如下:
ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point()
生成图片:
如果并不需要根据class类区分多种颜色,也可以将所有散点编辑成统一的颜色。这种情况下则在图层函数参数中进行修改:
将所有散点设置为蓝色:
ggplot(mpg, aes(displ, hwy)) +
geom_point(colour = "blue")
生成图片:
分面是比较不同分组的另一种方法:可以将数据分割成若干子集,然后创建一个图形矩阵,将每个子集绘制到图形矩阵的窗格中。
分面有两种主要类型:网格(grid)和包装(wrapped)。相较而言,Wrapped更常用。
使用方法是添加facet_wrap()
函数,参数写法是~
+变量,例如
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~class)
生成图片:
ggplot2绘制各类几何对象的功能很强大。geom_point()
是散点图的函数命令,除此之外,ggplot2还具有大量绘制其他几何对象的命令,几乎可以画出任何一种类型的图形,以下是几种主要的常用命令:
geom_smooth()
:拟合一条平滑曲线,并显示标准误geom_boxplot()
:绘制箱线图,概括一系列点的分布情况geom_histogram()
:绘制直方图geom_bar()
:绘制条形图geom_path()
:在数据之间连线如果散点图的数据较多噪点较大,那么数据显示的趋势就不是十分的明显,这种情况下可以使用geom_smooth()
函数添加一条平滑曲线
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth()
在第三层加上一个geom_smooth()
命令即可在散点图的基础上添加一条平滑的趋势曲线:
其中灰色部分是置信区间,如果不需要标明标准误,可以添加参数geom_smooth(se = FALSE)
,即可取消灰色部分。
通过改变method
可以设置曲线平滑度等多种参数。而method
则包括几种类型:在数据量n较小时,系统默认 method = "loess"
算法;而在数据量n>1000时,则采用 method = "gam"
算法;此外还有method = "lm"
和method = "rlm"
算法。
method = "loess"
:在数据量较小时默认使用。span
参数控制曲线的平滑程度,其取值范围是0~1(从很不平滑到很平滑)method = "gam"
:此算法通过调用mgcv包拟合一个广义可加模型,使用formula = y ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth(method = "gam", formula = y ~ s(x))
method = "lm"
和method = "rlm"
:这两种算法拟合的是线性模型,默认条件下回生成一条直线。可以通过添加二项式改变自由度使曲线波动变大。后者对异常值不敏感,但在使用前需要先加载MASS包。变量可以分为很多种,比如连续变量、分类变量等。当数据集中包含了分类变量和连续变量时,我们想了解连续变量是怎样随着不同的分类变量水平变化而变化,这时散点图中则会出现大量重叠,而箱式图则可以更清晰的展示这类数据。
以耗油量的数据集为例,我们想了解不同类别汽车的耗油量有什么差别,就可以使用箱式图。
箱式图主要有三种函数:
geom_jitter()
:扰动点图,和普通散点图相比减少数据点的重叠ggplot(mpg, aes(drv, hwy))+
geom_jitter()
geom_boxplot()
:箱式图,,可以相对直观的看出数据分布特点。箱式图用于多组数据平均水平和变异程度的直观分析比较。每组数据均可呈现其最小值、最大值、平均水平,最小值、最大值形成间距都可以反映数据的变异程度。ggplot(mpg, aes(drv, hwy))+
geom_boxplot()
geom_violin()
:小提琴图,在普通箱式图的基础上可以从形状表示出点的“密度”ggplot(mpg, aes(drv, hwy))+
geom_violin()
这两类图适合于展示单个变量的分布,但不太适合在组间进行比较。
geom_histogram()
:直方图又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。其中binwidth
参数可以用来设置组距,通过组距调节平滑度。ggplot(mpg, aes(hwy)) +
geom_histogram(binwidth = 0.6)
geom_freqpoly()
:密度曲线图ggplot(mpg, aes(hwy)) +
geom_freqpoly(binwidth = 0.6)
ggplot(mpg, aes(displ, colour = drv)) +
geom_freqpoly(binwidth = 0.5)
facet_wrap()
函数:ggplot(mpg, aes(displ, fill = drv)) +
geom_histogram(binwidth = 0.5) +
facet_wrap(~drv, ncol = 1)
geom_bar()
是用于绘制条形图的函数
例如
ggplot(mpg, aes(manufacturer)) +
geom_bar()
线条图(Lines)和路径图(Path plot)通常用于可视化时间序列数据。
这里我们使用另一套包含较多时间序列的数据集(美国过去40年经济数据)。可以做出随着时间变化,美国失业率变化的示意图:
ggplot(economics, aes(date, unemploy/pop)) +
geom_line()
例如,下面我们可以画出失业率和失业人数随时间变化之间的关系的路径图
year <- function(x) as.POSIXlt(x)$year + 1900
ggplot(economics, aes(unemploy / pop, uempmed)) +
geom_path(colour = "grey50") +
geom_point(aes(colour = year(date)))
xlab()
和ylab()
是两个最常用的修改和补充坐标轴名称的函数。可以添加在ggplot()
第三行-第四行的位置。例如:library(ggplot2)
mpg
ggplot(mpg, aes(cty, hwy)) +
geom_point(alpha = 1 / 3) +
xlab("city driving (mpg)") +
ylab("highway driving (mpg)")
xlim()
和ylim()
可用来限制横轴或纵轴的宽度/量程/范围/最大值最小值等。例如:ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25, na.rm = TRUE) +
ylim(NA, 30)
除了写脚本的方法,在交互式程序下也可以通过将绘图保存在变量中,然后通过print()
生成图片。
> p <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
+ geom_point()
> print(p)
参考资料:
- Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4
- 《R语言应用系列丛书·ggplot2:数据分析与图形艺术》