10.1 简介
# 好的数据分析都应该具有灵活性这一优点
# 如果数据发生变化,或者出现一些很不利于基本假设的信息时
# 这时候我们应该能够快速、便捷地更改之前的图形
# 本章主要介绍三种减少重复性工作的方法
# 1,10.2节--如何在之前图形的基础上迭代地进行修改
# 2,10.3节--如何制作具有重复处理机制,并且只需定义一次就可以多次使用的“绘图模板”
# 3,10.4节--如何来写可以绘制、修改图形的函数
10.2 迭代
# ggplot2会将你最后一次绘制或者修改的图形储存下来
# 输入last_plot()即可获取该图形
# 可以从一个最基本的图形开始,迭代式地逐步添加图层和调整标度
# 下面地示例展示了将一个感兴趣地图形区域逐步放大
# 并且添加新地图层来突出显示我们发现地信息:x值和y值相同地钻石很少
qplot(x,y,data = diamonds,na.rm = T)
last_plot() + xlim(3,11) + ylim(3,11)
last_plot() + xlim(4,10) + ylim(4,10)
last_plot() + xlim(4,5) + ylim(4,5)
last_plot() + xlim(4,4.5) + ylim(4,4.5)
last_plot() + geom_abline(colour = "red")
# 当图形调整至所期望地样子后
# 创建一个能生成最终图形的独立代码
qplot(x,y,data = diamonds,na.rm = T) + geom_abline(colour = "red") + xlim(4,4.5) + ylim(4,4.5)
10.3 绘图模板
# ggplot2图形的每一个组件都是一个对象
# 可以被创建、存储并独立应用于某个图形中
# 我们可以创建可重用的组件来自动执行某些常用任务
# 下面的示例创建一个颜色标度并应用到两个图形中
gradient_rb <- scale_colour_gradient(low = "red",high = "blue")
qplot(cty,hwy,data = mpg,colour = displ) + gradient_rb
qplot(bodywt,brainwt,data = msleep,colour = awake,log = "xy") + gradient_rb
# 可以将ggplot2中的组件存储为list的列表
# 下面的示例创建了两个连续标度,用来取消坐标轴标签和刻度
xquiet <- scale_x_continuous("",breaks = NULL)
yquiet <- scale_y_continuous("",breaks = NULL)
quiet <- list(xquiet,yquiet)
qplot(mpg,wt,data = mtcars) + quiet
qplot(displ,cty,data = mpg) + quiet
# 创建一个在图形中添加线性模型的函数
# 示例如下
geom_lm <- function(formula = y~x){
geom_smooth(formula = formula,se = F,method = "lm")
}
qplot(mpg,wt,data = mtcars) + geom_lm()
library(splines)
qplot(mpg,wt,data = mtcars) + geom_lm(y ~ ns(x,3))
10.4 绘图函数
# 如果对某一种基本图形,反复地将其应用到不同地数据集或参数上
# 这时很有必要将所有不同地选项封装成一个简单的函数
# 需要考虑的问题:
# 1,由于是在函数的环境中创建图形,因此以数据框格式向ggplot()传递参数时需要格外小心
# 2,若允许用户向图形属性映射中提供自定义变量,建议使用aes_string()
# 3,应该把绘图代码切分为两个函数,一个做数据变换和处理,另一个绘图
# 数据标准化函数
range01 <- function(x){
rng <- range(x,na.rm = T)
(x - rng[1])/diff(rng)
}
# 数据变换处理函数
pcp_data <- function(df){
numeric <- laply(df,is.numeric)
# 每一列的数值调整到相同范围
df[numeric] <- colwise(range01)(df[numeric])
# 行名作为行识别信息
df$.row <- rownames(df)
# melt将非数值变量作为id.vars
dfm <- melt(df,id = c(names(df)[!numeric]))
# 给数据框添加pcp类
class(dfm) <- c("pcp",class(dfm))
dfm
}
# 绘图函数
pcp <- function(df,...){
df <- pcp_data(df)
ggplot(df,aes(variable,value)) + geom_line(aes(group = .row))
}
# 绘制平行坐标图
pcp(mpg)
# 以不同颜色来区分类别
pcp(mpg) + aes(colour = drv)
# 封装函数的一个很好的例子是qplot()
# 如果想自己写类似的函数,强烈建议逐行认真阅读qplot()函数的源代码,去理解它的工作原理