R Graph
1. 因子
因子用于表示一组(列)数据中的类别,可以记录这组数据中的类别名称及类别数目。
创建:
sex <- factor(c('a','z','d','e'))
查看:
levels(sex)
作用:实现研究对象的分组、分类计算。绘图时因子可以帮助自动实现分组绘图。在后面的绘图函数中可以见识到因子的重要作用。
2. Lattice绘图包
Lattice包的绘图都服从以下格式:
draw_fun_xxx(formula, data=,options)
data: 指定一个数据框。
options: 为逗发隔的参数序列,用于修改图形的内容、摆放方式和标注等。
formula:指定要展示的变量和条件变量。
y ~ x | A
”|”左边为主要变量,右边为条件变量。“~”左边为应变量,右边为自变量。
draw_fun_xxx:可以是以下的函数,
- contourplot():三维等高线图;
- levelplot():三维水平图;
- cloud():三维散点图;
- wireframe():三维线框图;
- barchart():条形图;
- bwplot():箱线图;
- dotplot():点图:
- histogram():直方图;
- densityplot():核密度图;
- parallel():平行坐标图;
- xyplot():散点图;
- splom():散点图矩阵;
- stripplot():带状图。
2.1 示例
library(lattice)
attach(mtcars)
densityplot(~mpg, main="Density Plot", xlab="Miles Per Gallon")
densityplot(~mpg | cyl, main="Density Plot by Number of Cylinders", xlab="Miles Per Gallon")
2.2 条件变量
Lattice图形的一个最强大之处便是可以添加条件变量,并创建和每个条件变量水平对应的图形面板。 通常,条件变量是因子,如果希望以连续变量为条件,那么一种方法是使用R的cut函数将连续型变量转换为离散型变量。
ncont <- equal.count(x,number=\#,overlap=proportion)
示例:
disp2 <- equal.count(mtcars\$disp, number=3,overlap=0)
xyplot(mpg ~ wt | disp2, data=mtcars)
2.3 面板
lattice包中的每个高级绘图函数都调用了一个默认的绘图函数来绘制面板,如以下两种形式是等价的:
xyplot(mpg ~ wt | displacement, data=mtcars)
xyplot(mpg ~wt | displacement, data=mtcars, panel=panel.xyplot)
可以使用自定义函数替换默认的函数,或者将一个或多个默认函数整合至自定义函数中,这意味着面板的绘制具备了极大的灵活性。 之前的例子绘制了mtcars数据集中mpg、wt和disp等变量间关系的散点图,如果需要添加回归线、轴须线和网格线,则需要创建自己的面板函数。
displacement <- equal.count(mtcars\$disp, number=3, overlap=0)
mypanel <- function(x, y){
panel.xyplot(x, y, pch=19)
panel.rug(x, y)
panel.grid(h=-1, v=-1)
panel.lmline(x, y, col="red", lwd=1, lty=2)
}
xyplot(mpg ~ wt | displacement, data=mtcars, layout=c(3, 1), aspect=1.5, main="Miles Per Gallon vs. Weight by Engine Displacement", xlab="Weight", ylab="Miles Per Gallon", panel=mypanel)
第二个例子:
library(lattice)
mtcars\$transmission <- factor(mtcars\$am, levels=c(0, 1),labels=c("Automatic", "Manual"))
panel.smoother <- function(x, y){
panel.grid(h=-1, v=-1)
panel.xyplot(x, y)
panel.loess(x, y)
panel.abline(h=mean(y), lwd=2, lty=2, col="green")
}
xyplot(mpg ~ disp | transmission, data=mtcars, scales=list(cex=.8, col="red"), panel=panel.smoother, xlab="Displacement", ylab="Miles Per Gallon", main="MPG vs. Displacement by Transmission Type", sub="Dotted lines are Group Means", aspect=1)
2.4 分组
当一个lattice图形表达式含有条件变量时,将会生成在该变量各个水平下的面板。若希望将结果叠加在一起,则需要将变量设定为分组变量(grouping variable)。以下代码用核密度图展示手动档和自动挡汽车的每加仑英里数分布情况。
library(lattice)
mtcars$transmission <- factor(mtcars$am, levels=c(0, 1), labels=c("Automatic", "Manual"))
densityplot(~mpg, data=mtcars, group=transmission, main="MPG Distribution by Transmission Type", xlab="Miles Per Gallon", auto.key=TRUE)
图例和图例符号不会默认生成,可以使用auto.key=TRUE创建一个摆放在图形上方的初步图例,或者以列表形式提供参数:
auto.key=list(space="right", columns=1, title="Transmission")
如果希望对图例进行更多控制,可使用key=选项,以下代码给出了一个示例。
library(lattice)
mtcars$transmission <- factor(mtcars$am, levels=c(0, 1), labels=c("Automatic", "Manual"))
colors <- c("red", "blue")
lines <- c(1, 2)
points <- c(16, 17)
key.trans <- list(title="Transmission", space="bottom", columns=2, text=list(levels(mtcars$transmission)), points=list(pch=points, col=colors), lines=list(col=colors, lty=lines), cex.title=1, cex=.9)
densityplot(~mpg, data=mtcars, group=transmission, main="MPG Distribution by Transmission Type", xlab="Miles Per Gallon", pch=points, lty=lines, col=colors, lwd=2, jitter=.005, key=key.trans)
2.5 页面摆放
由于lattice函数不识别par()设置,所以如果希望在一个页面中摆放多个图形,最简单的方法是先将lattice图形存储到对象中,然后利用plot()函数中的split=或position=选项来进行控制。
split选项将页面分割为一个指定行数和列数的矩阵,然后将图形放置到该矩阵中。split选项格式为,split=c(placement row, placement column, total number of rows, total number of columns)。
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)
使用position=选项可以对大小和摆放方式进行更多的控制,position选项的格式为,position=c(xmin, ymin, xmax, ymax),原点在图形左下角。
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, position=c(0, .3, 1, 1))
plot(graph2, position=c(0, 0, 1, .3), newpage=FALSE)
3 常见选项
aspect:数值,设定每个面板中图形的宽高比
col,pch,lty,lwd: 颜色、符号、线条类型和宽度
groups: 分组的变量(因子)
mtcars$transmission <- factor(mtcars$am,levels = c(0,1),labels = c("Automatic","Manual"))
colors <- c("red","blue")
lines <- c(1,2)
points <- c(16,17)
key.trans <- list(title = "Trasmission",space = "bottom",columns = 2,
text = list(levels(mtcars$transmission)),
points = list(pch = points,col = colors),
lines = list(col = colors,lty = lines),
cex.title = 1,cex = .9)
densityplot(~mpg,data = mtcars,groups = transmission,
main = "MPG Distribution by Transmission Type",
xlab = "Mile per Gallon",
pch = points,lty = lines,col = colors,lwd = 2,jitter = .005,
key = key.trans)
index.cond: 列表,设置面板的展示顺序
key(或auto.key): 函数,添加分组变量的图例符号
layout:两元素数值型向量,设定面板的摆放方式(行数和列数);如需要,可以添加第三个元素,以指定页数
main、sub: 字符向量,设定主标题和副标题
panel: 函数,设定每个面板要生成的图形
scales: 列表,添加坐标轴标注信息
displacement <- equal.count(mtcars$disp, number=3,overlap=0)
mypanel <-function(x,y){ //这代码是不是很眼熟?前面出现过。。。
panel.xyplot(x,y,pch=19)
panel.rug(x,y)
panel.grid(h=-1,v=-1)
panel.lmline(x,y,col = "red",lwd = 1,lty = 2)
}
xyplot(mtcars$mpg~mtcars$wt|displacement,
main = "Miles per Gallon vs. Weight by Engine Displacement",
scales = list(cex=.8,col = "red"),
xlab = "Weight",ylab = "Mile per Gallon",
layout = c(3,1),aspect = 1.5,panel = mypanel,index.cond = list(c(2,1,3)))
#不设置index.cond = list(c(2,1,3))
xyplot(mtcars$mpg~mtcars$wt|displacement,
main = "Miles per Gallon vs. Weight by Engine Displacement",
scales = list(cex=.8,col = "red"),
xlab = "Weight",ylab = "Mile per Gallon",
layout = c(3,1),aspect = 1.5,panel = mypanel)
strip: 函数,设定面板条带区域
split,position: 数值向量,在一页上绘制多个图形. 由于lattice函数不识别par() 设置,因此你需要另辟蹊径。最简单的方法便是先将lattice图形存储到对象中,然后利用plot() 函数中的split =或position =选项来进行控制。
type: 字符型向量,设定一个或多个散点图的绘图参数(如p=点、l=线、r=回归、smooth=平滑曲线、g=格点)
xlab,ylab: 字符向量,设定横轴和纵轴标签
xlim,ylim: 两个元素的数值向量,分别设置横轴和纵轴的最小值和最大值