ggplot2:数据分析与图形艺术 学习笔记10---第十章 减少重复性工作

浏览: 3786

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")

Clipboard Image.pngClipboard Image.png


Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

# 当图形调整至所期望地样子后
# 创建一个能生成最终图形的独立代码
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

Clipboard Image.pngClipboard Image.png


# 可以将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

Clipboard Image.pngClipboard Image.png


# 创建一个在图形中添加线性模型的函数

# 示例如下

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))

Clipboard Image.pngClipboard Image.png


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)

Clipboard Image.pngClipboard Image.png


# 封装函数的一个很好的例子是qplot()

# 如果想自己写类似的函数,强烈建议逐行认真阅读qplot()函数的源代码,去理解它的工作原理

推荐 0
本文由 Parlan怕冷 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册