减少重复性工作
主要介绍三种减少重复性工作的方法。
迭代
ggplot2会将你最后一次绘制或者修改的图形储存下来,输入last_plot()
即可获取该图形。
将感兴趣的图形区域逐步放大
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")
当不断放大图形时,交互地使用last_plot()
可以快速有效地找到最佳视图。最后一张图上添加了一条截距为0斜率为1的直线。
绘图模板
ggplot2 图形的每一个组件都是一个对象:可以被创建、存储并独立应用于某个图形中。鉴于此,我们可以创建可重用的组件来自动执行某些常用的任务,从而不用多次重复输入冗长的函数。
gradient_rb <- scale_colour_gradient(low = "red",high = "blue")
p1 <- qplot(cty,hwy,data = mpg,colour=displ) + gradient_rb
p2 <- 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)
p1 <- qplot(mpg,wt,data = mtcars) + quiet
p2 <- qplot(displ,cty,data = mpg) + quiet
类似地,创建一个改变图层默认设置的函数也很简单。例如,想要创建一个在图形中添加线性模型的函数。
geom_lm <- function(formula= y~x){
geom_smooth(formula = formula,se=F,method = "lm")
}
p1 <- qplot(mpg,wt,data = mtcars) + geom_lm()
library(splines)
p2 <- qplot(mpg,wt,data = mtcars) + geom_lm(y~ns(x,3))
绘图函数
需要考虑的问题
- 由于是在函数的环境中创建图形,因此以数据框的格式向ggplot()传递参数时需要格外小心。还需确保没有在图形属性映射中误用了任何函数的局部变量。
- 若允许用户向图形属性映射中提供自定义变量,建议使用
aes_string()
。aes_string(“cty”,colour = “hwy”)与aes(cty,colour= hwy)的功能是一样的。 - 因该把绘图代码切分为两个函数,一个做数据变换和处理,另一个绘图。
library(reshape2)
library(plyr)
range01 <- function(x){
rng = range(x,na.rm = T)
(x - rng[1])/diff(rng)
}
range01(c(1,2,3,4))
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) ## 绘制平行坐标图
绘制平行坐标图并以不同颜色来区分类别(以drv划分)。
pcp(mpg) + aes(colour = drv)