ggplot入门
ggplot采用图层的语法,基于数据构建统计图形。统计图形就是从数据到几何对象中图形属性的映射,多个基本的图层简单相加就可以构建复杂的图形。
ggplot图形基本结构
每个ggplot都包含三个关键组件
- 数据(data), 数据是基础
- 图形属性映射(aesthtic mapping), 图形属性是指表征图形外观的属性 (如点的颜色,形状,坐标轴等)
- 几何对象(geometic objects), 如何展示数据,几何对象可创建新的图层 如散点图:
## 发动机排量displ和在高速上每加仑里程数hwy
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point()
- 数据,
mpg
- 图形属性映射,由
aes
实现,x = displ
和y = hwy
表示 变量displ
和hwy
分别映射至x
轴和y
轴 - 几何对象,由
geom_point()
创建
首先是ggplot()
初始化图形,读入数据,变量到图形属性的映射;然后用+
添加其他图层 (散点图)geom_point()
.
图形属性aesthetic
常用的图形属性有颜色(colour
),形状(shape
),大小(size
),每一个变量到图形属性的映射是利用标度(scale)实现。
# `aes`默认的前两个参数是`x`和`y`
# color 常用于离散的分类数据, 对于数值型分类数据,用`factor()`转化为因子,否则会被视为连续数据
ggplot(mpg, aes(displ, hwy, color = factor(cyl))) +
geom_point() +
ggtitle("Mapping color aes in ggplot()") # 设置图形的title
# 也可以在后面的图层中设置相应的图形属性 (覆盖初始化时的图形属性设置)
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = factor(cyl))) +
ggtitle("Mapping color aes in geom_point()")
如果设置图形属性为固定值 (如点的颜色为grey50
),那么必须在相应图层的aes()
之外设置
# 正确方法
ggplot(mpg, aes(displ, hwy)) +
geom_point(color = "blue") +
ggtitle("Fixed color in individual layer outside of aes()")
# 在aes()中设置,则会映把"blue"映射到一种颜色(默认为浅粉色),并且添加一个图例(legend)
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = "blue")) +
ggtitle("Fixed color in aes()")
# 如果是在初始化的时候在`aes()`之外设置"blue",在添加`geom_point()`图层时点的颜色为主题默认颜色(黑色)
ggplot(mpg, aes(displ, hwy), color = "blue") +
geom_point() +
ggtitle("Fixed color in ggplot() outside of aes()")
需要注意的是不同的图形属性适应于不同类型的变量,如颜色和性状适用于分类数据,而大小适用于连续变量。
几何对象geom
几何对象指定图形中展示数据的方式,通过上面的例子我们指导geom_point()
用于画散点图,ggplot中几何对象命名方式为geom_*()
,如常用的几何对象有
geom_point()
,散点图geom_line()
, 线图geom_bar()
, 条形图geom_histogram()
, 直方图- …
# 失业长度(uempmed)随着时间(date)的变化情况
ggplot(economics, aes(date, uempmed)) +
geom_line() +
ggtitle("Line plot")
ggplot(mpg, aes(drv)) +
geom_bar() +
ggtitle("Bar plot")
ggplot(mpg, aes(hwy)) +
geom_histogram() +
ggtitle("Histogram plot")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# 频率多边形
ggplot(mpg, aes(hwy)) +
geom_freqpoly() +
ggtitle("Frequency polygon plot")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.