程振兴 @czxa.top
截止今天,我已经在本博客上写了604.4k个字了!
本文主要介绍了三种减少重复性工作的方法。
迭代
1 | library(ggplot2) |
绘图模版
1 | gradient_rb <- scale_colour_gradient(low = "red", high = "blue") |
1
qplot(bodywt, brainwt, data = msleep, colour = awake, log = "xy") + gradient_rb
同存储单个对象一样,也可以将ggplot2中的组件存储为list格式的列表。向某个图形中添加组件列表和将其中的组件按顺序逐个添加是一样的效果。下面的例子创建了两个连续的标度,用来取消坐标轴标签和刻度。这些对象只需要被创建一次,便可以应用于到很多不同的图形中,代码如下:1
2
3
4xqui <- scale_x_continuous("", breaks = NULL)
yqui <- scale_y_continuous("", breaks = NULL)
qui <- list(xqui, yqui)
qplot(mpg, wt, data = mtcars)
1
qplot(mpg, wt, data = mtcars) + qui
类似地,创建一个改变图层默认设置的函数也很简单,例如,如果想要创建一个在图形中添加线性模型的函数,代码如下:1
2
3
4geom_lm <- function(formula = y~x){
geom_smooth(formula = formula, se = F, method = "lm")
}
qplot(mpg, wt, data = mtcars) + geom_lm()
1
2library(splines)
qplot(mpg, wt, data = mtcars) + geom_lm(y ~ ns(x, 3))
绘图函数
下面的例子展示了如何把平行坐标图封装成一个函数的方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27library(plyr)
library(reshape2)
theme_set(theme_bw(base_size = 30, base_family = "STSong"))
range01 <- function(x) {
rng <- range(x, na.rm = TRUE)
(x - rng[1])/diff(rng)
}
pcp_data <- function(df, ...) {
df <- mpg
numeric <- laply(df, is.numeric)
# 每一列的数值调整到相同的范围
df[numeric] <- colwise(range01)(df[numeric])
# 行名作为行识别信息
df$.row <- rownames(df)
# Melt 将非数值变量作为id.vars
dfm <- melt(df, id = c(".row", ...))
# 给数据框添加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, names(mpg)[!laply(mpg, is.numeric)])
last_plot() + aes(colour = drv)