R语言实战笔记--第十六章 高级图形进阶

R语言实战笔记–第十六章 高级图形进阶

标签(空格分隔): R语言 lattice 交互式图形


图形系统简介

  本文为R语言实战中最后一章,介绍的是图形的高级进阶,主要讲述了两个包(lattice和ggplot2)以及交互式图形的做法,极大扩展了R的绘图功能,R中的图形系统主要有四种,base、grid、lattice和ggplot2。
  base不需要加载,直接可以使用,之前几乎所有的统计绘图都使用了这个包;grid需要手动加载,但因这个包并没有统计图形,因此书中没有介绍这个包的使用;lattice需要手动加载,它和前面两个包都是预装在R中,并不需要安装,直接加载即可,它提供栅栏图形的绘制;ggplot2包需要先安装,然后第一使用时先加载,提供一个全面的、基于语法的、连贯一致的图形生成系统,允许用户创建新颖的、有创新性的数据可视化图形。
  本书介绍的是后两个包。

lattice包

使用介绍

  先看一下函数的使用方式

graph_function(formula,data=,options)
graph_function:lattice包中的绘图函数;
formula:图形公式,和绘图函数一起由下表给出;
data:数据框
options:以逗号分隔的参数,由第二个一给出。

表1:绘图函数及绘图公式
注:表中小写字母代表数值变量,大字字母代表类别型变量

图形类型 函 数 表达式示例
三维等高线图 contourplot() z ~ x*y
三维水平图 levelplot() z ~ y*x
三维散点图 cloud() z ~x*y|A
三维线框图 wireframe() z~y*x
条形图 barchart() x ~ A或A ~ x
箱线图 bwplot() x ~ A或A ~ x
点图 dotplot() ~ x|A
直方图 histogram() ~ x
核密度图 densityplot() ~ x|A*B
平行坐标图 parallel() dataframe
散点图 xyplot() y ~ x|A
散点图矩阵 splom() dataframe
带状图 stripplot() A ~ x或x ~ A

表2:常见参数选项(options)

选 项 描 述
aspect 数值,设定每个面板中图形的宽高比
col、pch、lty、lwd 向量,分别设定图形中的颜色、符号、线条类型和线宽
Groups 用来分组的变量(因子)
index.cond 列表,设定面板的展示顺序
key(或auto.key) 函数,添加分组变量的图例符号
layout 两元素数值型向量,设定面板的摆放方式(列数和行数);如有需要,可以添加第三个元素,以指定页数,注意,是列数和行数,即layout=c(列数,行数)
Main、sub 字符型向量,设定主标题和副标题
Panel 函数,设定每个面板要生成的图形
Scales 列表,添加坐标轴标注信息
Strip 函数,设定面板条带区域
Split、position 数值型向量,在一页上绘制多幅图形
Type 字符型向量,设定一个或多个散点图的绘图参数(如p=点、l=线、r=回归、smooth=平滑曲线、g=格点)
xlab、ylab 字符型向量,设定横轴和纵轴标签
xlim、ylim 两元素数值型向量,分别设定横轴和纵轴的最小和最大值

以下代码可以快速观看大部分图形的组成

library(lattice)
attach(mtcars)
gear <- factor(gear, levels = c(3, 4, 5), labels = c("3 gears", "4 gears", "5 gears"))
cyl <- factor(cyl, levels = c(4, 6, 8), labels = c("4 cylinders", "6 cylinders", "8 cylinders"))
densityplot(~mpg, main = "Density Plot", xlab = "Miles per Gallon")
densityplot(~mpg | cyl,  main = "Density Plot by Number of Cylinders", xlab = "Miles per Gallon")
bwplot(cyl ~ mpg | gear,  main = "Box Plots by Cylinders and Gears", xlab = "Miles per Gallon", ylab = "Cylinders")
xyplot(mpg ~ wt | cyl * gear,  main = "Scatter Plots by Cylinders and Gears", xlab = "Car Weight", ylab = "Miles per Gallon")
cloud(mpg ~ wt * qsec | cyl,  main = "3D Scatter Plots by Cylinders")
dotplot(cyl ~ mpg | gear, main = "Dot Plots by Number of Gears and Cylinders", xlab = "Miles Per Gallon")
splom(mtcars[c(1, 3, 4, 5, 6)], main = "Scatter Plot Matrix for mtcars Data")
detach(mtcars)

对lattice包中的函数来说,还可以把图形先赋给一个变量,然后通过plot画出,通过update更新!如下代码:

mygraph<-densityplot(~height|voice.part,data=singer)
plot(mygraph)
update(mygraph,col="red",pch=16,cex=0.8,jitter=0.05,lwd=2)

条件变量

  如上面的例子,每个一条件变量就会创建出条件变量下各个水平的单独图形,这是强大之处,但条件变量通常是因子,如果想要把连续变量变成条件变量,就需要用到R中的cut函数来把连续变量打散为离散变量,而lattice包也提供一种称之为瓦块的数据结构,它可以使连续变量变量转变为系列(可能)重叠的数值范围中,如下代码:

myshingle<-equal.count(x,number=#,overlap=proportion)
x为连续形向量,number为需要分为#个瓦块,overlap为重叠度proportion,可以为0
#示例如下:
displacement <- equal.count(mtcars$disp, number = 3, overlap = 0)
xyplot(mpg ~ wt | displacement, data = mtcars, layout = c(3, 1), aspect = 1.5)    #注意:layout后面的c(3,1)为3列1行!

面板函数

  所谓面板,就是组图面板,它包括了面板中一些基础设置,比如散点图或者是线图,或者两个都有,也包括了背景色,栅格线条色,线形等等。
  调用graph_function时,就默认调用了panel=panel.graph_function参数,比如下面两条命令是等效的。

densityplot(~height|voice.part,singer)
densityplot(~height|voice.part,singer,panel=panel.densityplot)

可以通过help(panel.graph_function)查看对应的函数面板设置,以及help(panel.functions)查看可以在面板上增加更多的绘图设置。要更全面的函数需要去下载官方说明文档【lattice.pdf】

分组变量

  注意和条件变量的区别,条件变量是把图形分开来绘制,而分组变量是把图形画在一个图上,但以不同图例标示,简单说明就是,条件变量在两幅图来画出15年和16年的销售增长图,而分组变量是在一幅图画出15年和16的销售增长图。
  分组变量由参数group给出,注意的是,分组变量只能有一个,它可以包含不同的水平,也可以和条件变量一起使用。由以下代码给出示例:

colors <- "darkgreen"
symbols <- c(1:12)
linetype <- c(1:3)
key.species <- list(title = "Plant", 
space = "right", 
text = list(levels(CO2$Plant)), 
points = list(pch = symbols, col = colors))
xyplot(uptake ~ conc | Type * Treatment, data = CO2, 
group = Plant, 
type = "o", 
pch = symbols, col = colors, lty = linetype, 
main = "Carbon Dioxide Uptake\nin Grass Plants", 
ylab = expression(paste("Uptake ", bgroup("(", italic(frac("umol", "m"^2)), ")"))), 
xlab = expression(paste("Concentration ", bgroup("(", italic(frac(mL, L)), ")"))), 
sub = "Grass Species: Echinochloa crus-galli", 
key = key.species)

图形参数

  图形参数,先认识一下三个函数,分别是获取参数函数trellis.par.get(),设置参数函数trellis.par.set(),以及展示函数show.settings(),以下代码给出修改过程:

show.settings()   #以图形展示目前参数设置状态
mysettings <- trellis.par.get()
mysettings$superpose.symbol    #展示参数内容,并不参与修改
mysettings$superpose.symbol$pch <- c(1:10)
trellis.par.set(mysettings)
show.settings()

页面摆放

  在之前,可以使用par的mfrow来设置页面的摆放,也可以使用layout(matrix(c()),nrow,ncol,byrow=T/F)函数来设置页面的摆放方式,在lattice包中,可以使用“图形对象”+“split(x,y,nx,ny)”+“newpage=F”来摆放图形;也可以使用position(xmin,ymin,xmax,ymax)来代替split来摆放图形
  需要注意的是,R语言实战中又出了一个坑,这个坑是从英文版就存在的,lattice包中的split中就是以c(x,y,nx,ny)来代表图形位置参数,而书中即是把它写成c(row,col,nrow,ncol)的形式,明显是行列写反了!

library(lattice)
graph1 <- histogram(~height | voice.part, data = singer, 
main = "Heights of Choral Singers by Voice Part")
graph2 <- densityplot(~height, data = singer, group = voice.part, 
plot.points = FALSE, auto.key = list(columns = 4))
plot(graph1, split = c(1, 1, 1, 2))
plot(graph2, split = c(1, 2, 1, 2), newpage = FALSE)
graph1 <- histogram(~height | voice.part, data = singer, 
main = "Heights of Choral Singers by Voice Part")
graph2 <- densityplot(~height, data = singer, group = voice.part, plot.points = FALSE, auto.key = list(columns = 4))
plot(graph1, position = c(0, 0.3, 1, 1))
plot(graph2, position = c(0, 0, 1, 0.3), newpage = FALSE)

ggplot2包

  R语言实战中并没有很详细的介绍这个包,而这个包的使用在书中只有qplot(quick plot)一个函数的使用方法,而实际上看,ggplot2作为R中最强大的包,它的使用都可以独立成书!此处mark一些网址,后面开单章学习ggplot2包吧。
  知乎:如何使用ggplot2
  搜狐:使用ggplot2经常问的10个问题
  百度文库:30分钟学会ggplot2
  官方手册:图形help
  下面还是记录一下书中所述的简单函数qplot(2.0版以上的ggplot2中,qplot功能已被弱化,书中的qplot功能已有部分无法实现,比如下面公式中的method和formula两个参数已经被Hadley大神移除!

qplot(x,y,data=,color=,shape=,size=,alpha=,geom=,method=,formula=,facets=,xlim=,ylim=,xlab=,ylab=,main=,sub=)

各参数的用处如下表:

选 项 描 述
alpha 元素重叠的alpha透明度,数值为0(完全透明)到1(完全不透明)间的分数
color、shape、size、fill 把变量的水平与符号颜色、形状或大小联系起来。对于直线图,color将把线条颜色与变量水平联系起来,对于密度图和箱线图,fill将把填充颜色与变量联系起来。图例将会被自动绘制
data 指定一个数据框
facets 指定条件变量,创建一个栅栏图。表达式如rowvar ~ colvar。为创建一个基于单条件变量的栅栏图,可用rowvar ~ .或. ~ colvar
geom 设定定义图形类型的几何形状。geom选项是一个单条目或多条目的字符型向量,包括”point” 、”smooth” 、”boxplot” 、 “line” 、”histogram” 、”density”、”bar”和”jitter”
main、sub 字符向量,设定标题和副标题
method、formula 注意:新版已移除此功能。若geom = “smooth”,则会默认添加一条平滑拟合曲线和置信区间。 当观测数大于1000时,便需要调用更高效的平滑拟合算法。方法包括回归lm、广义可加模型gam、稳健回归rlm。formula参数指定拟合的形式例如,要添加简单的回归曲线,则设定geom = “smooth”, method = “lm”,formula = y ~ x。将表达式改为y ~ poly(x, 2)将生成二次拟合。注意表达式使用的是字母x和y,而不是变量的名称,对于method = “gam”,一定要记得加载mgcv包。对于method = “rml”,则需加载MASS包
x、y 指定摆放在水平轴和竖直轴的变量。对于单变量图形(如直方图),则省略y
xlab、ylab 字符向量,设定横轴和纵轴标签
xlim、ylim 二元素数值型向量,分别指定横轴和纵轴的最小值和最大值

虽然部分功能已移除,但是也不防看看这些代码来感受一下ggplot2的强大!

\# --ggplot2--

\# box plots example
library(ggplot2)
mtcars$cylinder <- as.factor(mtcars$cyl)
qplot(cylinder, mpg, data=mtcars, geom=c("boxplot", "jitter"), fill=cylinder,
main="Box plots with superimposed data points",
xlab= "Number of Cylinders",
ylab="Miles per Gallon")

\# regression example
library(ggplot2)
transmission <- factor(mtcars$am, levels = c(0, 1), 
labels = c("Automatic", "Manual"))
qplot(wt, mpg, data = mtcars, 
color = transmission, shape = transmission, 
geom = c("point", "smooth"), 
method = "lm", formula = y ~ x, 
xlab = "Weight",  ylab = "Miles Per Gallon", 
main = "Regression Example")

# bubble plot example
library(ggplot2)
mtcars$cyl <- factor(mtcars$cyl, levels = c(4, 6, 8), 
labels = c("4 cylinders", "6 cylinders", "8 cylinders"))
mtcars$am <- factor(mtcars$am, levels = c(0, 1), 
labels = c("Automatic", "Manual"))
qplot(wt, mpg, data = mtcars, facets = am ~ cyl, size = hp)

\# density plot example
library(ggplot2)
data(singer, package = "lattice")
qplot(height, data = singer, geom = c("density"), 
facets = voice.part ~ ., fill = voice.part)

交互式图形

  与图形的交互功能有时是必须的,R关于这方面的包书中提到四个,分别是playwith、latticist、iplot和rggobi。
  其实在此之前,已经使用到一个初级的交互,鉴别点交互:identify(),可以对图形中的点进行交互识别,直到点stop或按下Esc为止。

plot(mtcars$wt,mtcars$mpg)
identify(mtcars$wt,mtcars$mpg,labels=row.names(mtcars))

playwith包
包提供了一个GTK+图形用户界面(GUI)界面,需要安装JGR后在JGR的console中运行library(),不过,一作出图之后就未响应,不知道什么原因。

latticist包
  与playwith包一样,无法安装,看起来也不像介绍得很详细的样子,不管。
iplot包
  整个交互式图形就这个包介绍得稍微详细一点。先看一下包中的作图函数:

函 数 描 述
ibar() 交互式柱状图
ibox() 交互式箱线图
ihist() 交互式直方图
imap() 交互式地图
imosaic() 交互式马赛克图
ipcp() 交互式平行坐标图
iplot() 交互式散点图

  如下代码可以作出六幅图形,可以在上面选择点,并作出一些参数调整,但遗憾的是,不能像identify一样标记异常点,labels也不能选择显示与否。

library(iplots)
attach(mtcars)
cylinders <- factor(cyl)
gears <- factor(gear)
transmission <- factor(am)
ihist(mpg)
ibar(gears)
iplot(mpg, wt)
ibox(mtcars[c("mpg", "wt", "qsec", "disp", "hp")])
ipcp(mtcars[c("mpg", "wt", "qsec", "disp", "hp")])
imosaic(transmission, cylinders)
detach(mtcars)

rggobi包
  它需要外部应用GGobi,而且也没有一个简介,要自己找资料
  
到目前为止,R语言实战的各章节已经学习完毕,当然,还有一些附录也是很值得学习的,比如说图形界面的学习等等很多功能。R的学习还没完结,仍需要进一步学习R中各项内容,比如导入导出专题、数据处理专题、数据检验专题等等,从整个数据分析的角度去回顾R中各功能的使用,同时也复杂数据分析技术!
  

你可能感兴趣的:(R)