ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象

Getting Started with ggplot2

ggplot()基本用法

由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()(散点图)

运行脚本后生成图片:

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第1张图片

图1:黑白散点图

另外,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()

生成图片:

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第2张图片

图2:彩色散点图

如果并不需要根据class类区分多种颜色,也可以将所有散点编辑成统一的颜色。这种情况下则在图层函数参数中进行修改:

将所有散点设置为蓝色:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(colour = "blue")

生成图片:

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第3张图片

图3:蓝色散点图

分面 (Facetting)

分面是比较不同分组的另一种方法:可以将数据分割成若干子集,然后创建一个图形矩阵,将每个子集绘制到图形矩阵的窗格中。

分面有两种主要类型:网格(grid)和包装(wrapped)。相较而言,Wrapped更常用。

使用方法是添加facet_wrap()函数,参数写法是~+变量,例如

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(~class)

生成图片:

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第4张图片

图4:分面图

绘制几何对象(Plot Geoms)

ggplot2绘制各类几何对象的功能很强大。geom_point()是散点图的函数命令,除此之外,ggplot2还具有大量绘制其他几何对象的命令,几乎可以画出任何一种类型的图形,以下是几种主要的常用命令:

  • geom_smooth():拟合一条平滑曲线,并显示标准误
  • geom_boxplot():绘制箱线图,概括一系列点的分布情况
  • geom_histogram():绘制直方图
  • geom_bar():绘制条形图
  • geom_path():在数据之间连线

1. 向图中添加平滑的曲线(Smoother)

如果散点图的数据较多噪点较大,那么数据显示的趋势就不是十分的明显,这种情况下可以使用geom_smooth()函数添加一条平滑曲线

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth()

在第三层加上一个geom_smooth()命令即可在散点图的基础上添加一条平滑的趋势曲线:

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第5张图片

图5:散点趋势线图

其中灰色部分是置信区间,如果不需要标明标准误,可以添加参数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
    ˜ s(x) 或y ˜ s(x, bs = “cs”)公式。
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth(method = "gam", formula = y ~ s(x))
  • method = "lm"method = "rlm":这两种算法拟合的是线性模型,默认条件下回生成一条直线。可以通过添加二项式改变自由度使曲线波动变大。后者对异常值不敏感,但在使用前需要先加载MASS包。

2. 箱线图(Boxplots)

变量可以分为很多种,比如连续变量、分类变量等。当数据集中包含了分类变量和连续变量时,我们想了解连续变量是怎样随着不同的分类变量水平变化而变化,这时散点图中则会出现大量重叠,而箱式图则可以更清晰的展示这类数据。

以耗油量的数据集为例,我们想了解不同类别汽车的耗油量有什么差别,就可以使用箱式图。

箱式图主要有三种函数:

  • geom_jitter():扰动点图,和普通散点图相比减少数据点的重叠
ggplot(mpg, aes(drv, hwy))+
  geom_jitter()

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第6张图片

图6:扰动点图
  • geom_boxplot():箱式图,,可以相对直观的看出数据分布特点。箱式图用于多组数据平均水平和变异程度的直观分析比较。每组数据均可呈现其最小值、最大值、平均水平,最小值、最大值形成间距都可以反映数据的变异程度。
ggplot(mpg, aes(drv, hwy))+
  geom_boxplot()

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第7张图片

图7:箱式图
  • geom_violin():小提琴图,在普通箱式图的基础上可以从形状表示出点的“密度”
ggplot(mpg, aes(drv, hwy))+
  geom_violin()

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第8张图片

图8:小提琴图

3. 直方图(Histograms)和密度曲线图(Frequency Polygons)

这两类图适合于展示单个变量的分布,但不太适合在组间进行比较。

  • geom_histogram():直方图又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。其中binwidth参数可以用来设置组距,通过组距调节平滑度。
ggplot(mpg, aes(hwy)) +
  geom_histogram(binwidth = 0.6)

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第9张图片

图9:直方图
  • geom_freqpoly():密度曲线图
ggplot(mpg, aes(hwy)) +
  geom_freqpoly(binwidth = 0.6)

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第10张图片

图10:密度曲线图
  • 可以通过设置颜色标记类别变量:
ggplot(mpg, aes(displ, colour = drv)) +
geom_freqpoly(binwidth = 0.5)

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第11张图片

图11:使用颜色区分类别的密度曲线图
  • 也可以使用分面模式来区别类别,添加facet_wrap()函数:
ggplot(mpg, aes(displ, fill = drv)) +
  geom_histogram(binwidth = 0.5) +
  facet_wrap(~drv, ncol = 1)

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第12张图片

图12:分面直方图

4. 条形图(Bar Charts)

geom_bar()是用于绘制条形图的函数

例如

ggplot(mpg, aes(manufacturer)) +
  geom_bar()

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第13张图片

图13:基本条形图

5. 时间序列线条图和路径图

线条图(Lines)和路径图(Path plot)通常用于可视化时间序列数据。

  • 线条图x轴一般表示时间,展示单个变量随时间变化的情况

这里我们使用另一套包含较多时间序列的数据集(美国过去40年经济数据)。可以做出随着时间变化,美国失业率变化的示意图:

ggplot(economics, aes(date, unemploy/pop)) +
  geom_line()

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第14张图片

图14:美国失业率随时间变化数据图
  • 路径图则展示两个变量随时间联动的情况,事件反映在点的顺序上。例如,将两个时间序列绘制在同一张图中,可以使用散点图,但并不能够反映出随时间变化的情况,对此解决的方法就是将临近时点的三点连接起来形成一张路径图。

例如,下面我们可以画出失业率和失业人数随时间变化之间的关系的路径图

year <- function(x) as.POSIXlt(x)$year + 1900
ggplot(economics, aes(unemploy / pop, uempmed)) +
  geom_path(colour = "grey50") +
  geom_point(aes(colour = year(date)))

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第15张图片

图15:路径图

修改坐标轴

  • xlab()ylab()是两个最常用的修改和补充坐标轴名称的函数。可以添加在ggplot()第三行-第四行的位置。例如:
library(ggplot2)
mpg

ggplot(mpg, aes(cty, hwy)) +
  geom_point(alpha = 1 / 3) +
  xlab("city driving (mpg)") +
  ylab("highway driving (mpg)")

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第16张图片

图16:修改坐标轴名称示例图
  • xlim()ylim() 可用来限制横轴或纵轴的宽度/量程/范围/最大值最小值等。例如:
ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25, na.rm = TRUE) +
  ylim(NA, 30)

ggplot2读书笔记2:ggplot()的基本用法以及如何绘制几何对象_第17张图片

图17:设定纵轴数值范围示例图

Output

除了写脚本的方法,在交互式程序下也可以通过将绘图保存在变量中,然后通过print()生成图片。

> p <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
+     geom_point()
> print(p)

参考资料:

  1. Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4
  2. 《R语言应用系列丛书·ggplot2:数据分析与图形艺术》

你可能感兴趣的:(ggplot2)