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

来源:互联网 发布:网络蜘蛛 重访策略 编辑:程序博客网 时间:2024/05/17 03:33

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 examplelibrary(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 examplelibrary(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 examplelibrary(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 examplelibrary(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中各功能的使用,同时也复杂数据分析技术!
  

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 彩金颜色不亮了怎么办 玫瑰金链子黑了怎么办 18k玫瑰金变黑了怎么办 玫瑰金戒指遇到火变黑怎么办 18k白金发黄了怎么办 18k金掉色后怎么办吗 dw手表金色掉漆怎么办 dw玫瑰金手表褪色怎么办 dw金色表带黑了怎么办 机械表机芯坏了怎么办 银镀玫瑰金褪色怎么办 苹果七p玫瑰金掉漆怎么办 美度镀金表掉色怎么办 吃了发黑的香菇怎么办 脸上的皮肤暗黄怎么办 吃了变黑的香菇怎么办 怀孕喝了玫瑰茶怎么办 孕妇爱喝茉莉茶怎么办 干菊花生虫了该怎么办 黑枸杞放了两年怎么办 来大姨妈喝茶了怎么办 干柠檬片过期了怎么办 山地玫瑰根黑了怎么办 带18k的金过敏怎么办 18k钻戒断了怎么办 18k钻戒戒托变色怎么办 苹果七中间按键脱漆怎么办 苹果手机屏幕边缘掉漆了怎么办 十八k白金变色了怎么办 手机后面掉漆了怎么办 玫瑰金戒指刮花了怎么办 玫瑰金手镯刮花了怎么办 玫瑰金链子断了怎么办 dw玫瑰金掉色了怎么办 6s玫瑰金氧化了怎么办 书本湿的很严重怎么办 除湿盒的水满了怎么办 书被水泡变黄了怎么办 文件纸被弄皱了怎么办 纸的一角皱了怎么办 裤子被雨水打湿变色了怎么办