ggplot2包学习笔记

Posted by rogerclarkgc on 周六 24 九月 2016

基本思想:

ggplot2包以将想要展现的数据以及数据中的变量对应到图形属性中的映射(mapping)这一过程作为自己的基本思路,其中有几个关键概念

几何对象(geom)图像的点、线、面等基本元素;

统计变换(stats)对数据的汇总、重塑的过程,如通过分组的方式建立直方图;

标度(scale)将数据的值映射到图形空间的一种过程,如用颜色、符合形状、大小来描述不同的取值。绘制图例和坐标轴就对应着分组变量——图例形状以及数值变量——空间坐标的两种映射;

坐标系(coord)常见的映射方式,描述了数据如何映射到空间的点的过程,同时还提供了坐标轴和网格线,笛卡尔坐标系是最常见的坐标系;

分面(facet)将数据分为若干子集,分别对子集作图并以图形矩阵的形式展示在同一张图像上的方法。

qplot函数

  • 基本用法:

    qplot(x, y, data, geom) 该函数是ggplot2包的快速绘图函数,参数geom是指图像的几何对象,几何对象有如下几种常用的值:

point绘制散点图,当指定了x和y的参数时默认设置。还可以用sizeshapecolouralpha等图形属性来描述图形特征

smooth绘制一条光滑曲线,同时会展示曲线的标准误差

boxplot绘制一个箱线图, 可以用fill属性来描述方块填充颜色

pathline绘制折线图

对于输入一维数据的情况,有这几种图像可以绘制

histogram绘制频数直方图 freqpoly绘制频率多边形 density绘制密度曲线 bar绘制离线数据的条形图

  • 分面:

qplot通过facets参数指定分面,用形如row_var ~ col_var的表达式来描述具体分面情况,如果只想指定一行或者一列,使用row_var ~ .的形式来指定单列图形或单行图形

例子:

qplot(carat, data = diamonds, facets = color ~ ., geom = "histogram", binwidth = 0.1, xlim = c(0, 3))

qplot(carat, ..density.., data = diamonds, facets = color ~ ., geom = "histogram", binwidth = 0.1, xlim = c(0, 3))

..density..可以指定直方图一密度作为y轴而不是频数

  • 其他选项

  • xlim, ylim 取值为一个长度为2的数值向量,用于指定坐标轴的区间

  • log表明对坐标轴取对数,log = "x"表明对x轴取对数,log = xy表明对x轴和y轴都取对数
  • main图形的标题
  • xlab, ylabx轴或y轴的标签文字

ggplot()函数:用图层构建对象

ggplot()函数的两个主要参数:

ggplotdata, aes())

data用于加载数据,aes()描述映射关系

p <- ggplot(data = diamonds, aes(x = carat, y = price, colour = cut)

这里用ggplot建立一个图层,使用diamonds作为数据,aes()中对应关系为:carat变量映射到x轴,price变量映射到y轴, cut变量映射的图像的颜色属性上。最后把这个实例赋值给对象p。

  • 添加图层:

layer函数可以在ggplot对象上添加图层,函数形式如下

layer(geom = NULL, stat = NULL, data = NULL, 
mapping = NULL,position = NULL, params = list(),
inherit.aes = TRUE, subset = NULL,show.legend = NA)

geom为该图层展现的几何对象类型,stat为使用的统计变换,data如果不指定,就会从ggplot对象中继承,mapping为映射关系,默认情况下从aes()函数中继承,position为位置参数。stat参数和position参数必须要明文指定。

p <- p + layer(geom = "point", stat = "identify", 
position = "identity)

这里在原来的图像的基础上加上一个图层,使用点作为几何对象。

更复杂一点的例子:

p <- ggplot(diamonds, aes(x = carat))
p <- p + layer(
geom = "bar",
stat = "bin",
position = "identity",
params = list(fill = "steelblue", binwidth = 0.2)
)
p

这里首先建立一个包含数据和映射的ggplot对象,然后添加了一个图层,这个图层的几何对象为直方图,并进行相应的统计变换,还指定了组距和填充颜色

更为便捷的替代layer函数的方法是直接使用geom_XXX和stat_XXX类函数,如上面的可改为

p <- ggplot(diamonds, aes(x = carat)) +
geom_histogram(binwidth = 0.2, fill = "steelblue)

等价的例子:

ggplot(msleep, aes(sleep_rem / sleep_total, awake)) + geom_point()
##等价于
qplot(sleep_rem / sleep_total, awake, data = msleep)
***************************************************
qplot(sleep_rem / sleep_total, awake, data = msleep,
geom = c("point", "smooth"))
###等价于
qplot(sleep_rem / sleep_total, awake, data = msleep) + 
geom_smooth()
###
ggplot(msleep, aes(x = sleep_rem / sleep_total, awake)) + geom_point() + geom_smooth()

图层本身也是个对象,可以赋值到任意变量上,这样可以重复利用这个图层的样式。

smoothfit <- geom_smooth(method = "lm", se = F, colour = alpha("steelblue", 0.5), size = 2)
qplot(sleep_rem, sleep_total, data = msleep) + smoothfit

上面代码在一个散点图上建立一个浅蓝色的半透明的回归线

  • 设定和映射:

有两种方式可以设定一个图层中元素的属性,如颜色属性:

##设定方式
p <- ggplot(mtcars, aes(mpg, wt))
p + geom_point(colour = "darkblue")
##映射方式
p + geom_point(aes(colour = I("darkblue"))

两种方式原理不同,设定方式直接更改geom_point对象的colour属性, 映射方式将colour这一属性与一个变量形成映射关系,如果不使用I()作标度转换,aes(colour = "darkblue")将进行默认的标度转换, “darkblue”作为一个单一的字符串变量与colour形成映射关系,默认的标度将按照这一个映射在色轮上等距取色,由于只有一个变量"darkblue",因此就只有一个颜色,为粉红色。

  • 分组:

通过将group映射到在不同组有不同取值的变量来在一张图像中绘制不同组的数据

多个分组与单个图形

p <- ggplot(Oxboys, aes(x = age, y = height, group = Subject)) +
geom_line()

指定Oxboys数据框中Subject映射到group中,将对么个Subject下的所有观测单独连线,绘制一条折线图。

不同图层上的不同分组

p + geom_smooth(aes(group = 1), method = "lm", se = F, size = 3)

让group = 1, 能基于所有数据点绘制一条回归直线,并且单独作为一个图层叠加到原来的图上

boybox <- ggplot(Oxboys, aes(Ocasion, height)) + geom_boxplot(fill = "blue")
boybox + geom_line(aes(group = Subject), colour = "red")

重新以Ocasion分组绘制height的箱线图,并加上了折线图层,设定了线的颜色

基本图形类型

常见的几种几何对象,它们都是二维的,并且都可有colour和size属性,填充型集合对象还可接受fill图形属性

geom_area()用于绘制面积图

geom_bar(stat = "identity")用于绘制条形图,stat = "identity"将直接对数据进行计数,而不进行统计变换

geom_line()用于绘制线条图,group属性决定哪些观测是相连的,

geom_path()与之类似,但它将线条按数据出现的顺序相连接。

geom_point()绘制散点图

geom_polygon()绘制多边形, 数据中的每一行代表多边形的一个顶点

geom_text()可在指定点处添加标签, 需要指定label参数,hjust和vjust属性控制文本横纵位置,angel控制文本的旋转

geom_title()绘制色深图或水平图

geom_boxplot = stat_boxplot + geom_boxplot绘制箱线图,在类别型变量时比较有用,对于连续变量,经过封箱处理后也可使用

library(plyr)
qplot(carat, depth, data = diamonds, geom = "boxplot", 
group = round_any(carat, 0.1, floor), xlim = c(0, 3))

geom_density = stat_density + geom_area:基于核密度得到的频率多边形

geom_jitter = position_jitter + geom_point通过添加随机噪声来避免点之间的相互遮盖的问题

解决遮盖问题

用更小的点来绘制散点图

df <- data.frame(x = rnorm(2000), y = rnorm(2000))
norm <- ggplot(df, aes(x, y))
norm + geom_point()
norm + geom_point(shape = 1)
norm + geom_point(shape = ".") #用“.”来作为图中的点

用透明度来表示重叠程度

norm + geom_point(colour = "black", alpha = 1/3)
norm + geom_point(colour = "black", alpha = 1/5)
norm + geom_point(colour = "black", alpha = 1/10)

給数据添加扰动减少重叠

td <- ggplot(diamonds, aes(table, depth)) + xlim(50, 70) + ylim(50, 70)
td + geom_point()
td + geom_jitter() #默认扰动
jit <- position_jitter(width = 0.5) #添加横向扰动
td + geom_jitter(position = jit)
td + geom_jitter(position = jit, colour = "black", alpha = 1/10)

给数据封箱

#bins控制箱的数量, binwidth控制箱的大小
d <- ggplot(diamonds, aes(carat, price)) + xlim(1, 3) + theme(legend.position = "none")
d + stat_bin2d()
d + stat_bin2d(bins = 10)
d + stat_bin2d(binwidth = c(0.02, 200))
d + stat_binhex(bins = 10)
d + stat_binhex(binwidth = c(0.02, 200))

使用stat_density2d作二维密度估计,并添加等高线

d <- ggplot(diamonds, aes(carat, price)) + xlim(1, 3) + theme(legend.position = "none")
d + geom_point() + geom_density2d()
d + stat_density2d(geom = "point", aes(size = ..density..), contour = F) + scale_size_area()
d + stat_density2d(geom = "tile", aes(fill = ..density..), contour = F)
last_plot() + scale_fill_gradient(limits = c(1e-5, 8e-4))

添加图形注解

geom_text添加文字叙述或为点添加标签

geom_vlinegeom_hline添加垂直和水平线

geom_abline添加任意斜率和截距的线

geom_react强调图形中感兴趣区域

geom_linegeom_pathgeom_segment添加直线,都有一个arrow参数,可以在线上放置一个箭头

*实例

unemp <- qplot(date, unemploy, data = economics, geom 
= "line", xlab = "", ylab = "No.unemployed(1000s))"
presidentia <- presidential[-(1:3), ]
yrng <- range(economics$unemploy)
xrng <- rangeeconomics$date)
unemp +geom_vline(aes(xintercept = as.numeric(start)), data = presidential) #添加垂直线,各个总统任期起始年
library(scale)
unemp + geom_rect(aes(NULL, NULL, xmin = start, xmax = end, fill = party), ymin = yrng[1], ymax = yrng[2],
data = presidential, alpha = 0.2) + scale_fill_manule(values = c("blue", "red") #强调感兴趣的区间,用蓝色红色交替显示
last_plot() + geom_text(aes(x = start, y = yrng[1], label = name), data = presidential, size = 3)#添加文字标签

含权数据

用点的大小来表示权重,即size属性 实例:

qplot(percwhite, percbelowpoverty, data = midwest)
#用人口数量做权重
qplot(percwhite, percbelowpoverty, data = midwest, 
size = poptotal / 1e6) + scale_size_area("Population\n(millions)", breaks = c(0.5, 1, 2, 4))
#用面积做权重
qplot(percwhite, percbelowpoverty, data = midwest, 
size = area) + scale_size_area()

考虑权重作为拟合结果

lm_smooth <- geom_smooth(method = lm, size = 1)
#不考虑人口密度作为权重
qplot(percwhite, percbelowpoverty, data = midwest) + lm_smooth
#考虑人口密度作为权重
qplot(percwhite, percbelowpoverty, data = midwest, weight = popdensity, 
size = popdensity) + lm_smooth

标度

标度(scale):控制了数据到图形的映射,可以把标度看成从数据空间的某个区域(函数的定义域)映射到属性空间的某个区域(函数的值域)的一个函数

  • 标度详解

标度可分为四种

位置标度:将连续型、离散型、日期-时间变量映射到绘图区域并构造坐标轴。

颜色标度:将连续型和离散型变量映射到颜色

手动标度:将离散型变量映射到我们选择的符号大小、线条类型、形状或颜色以及创建对应的图例

同一型标度:用于直接将变量值绘制为图形属性,而不去映射它们。如将某个变量映射成符号的颜色,而该变量本身就是颜色值组成的向量, 那么我们无须将其映射为其他颜色,直接进行渲染

  • 通用参数

标度通用的参数

name设置坐标轴或者图例上出现的标签

例子:

p <- qplot(cty, hwy, data = mpg, colour = displ)
p
p + scale_x_continuous(name = "City mpg")
p + xlab("City mpg") #用xlab()更便捷
p + ylab("Highyway mpg")
p + labs(x = "City mpg", y = "Highway", colour = "Displacement")
p + xlab(expression(frac(miles, gallon)))

limits固定标度的定义域。连续型标度接受一个长度为2的数值型向量;离散型标度接受一个字符型向量。

breakslabels前者控制坐标轴或图例上的值,后者指定了应在断点处显示的标签。若设置了labels,必须同时指定了breaks

tags: R, packages