本文对应《R语言实战》第11章:中级绘图;第16章:高级图形进阶
基础图形一章,侧重展示单类别型或连续型变量的分布情况;中级绘图一章,侧重展示双变量间关系(二元关系)和多变量间关系(多元关系)的绘图;高级绘图进阶一章介绍四种图形系统,主要介绍lattice和ggplot2包。
=========================================================================
散点图:
主要内容:把多个散点图组合起来形成一个散点图矩阵,以便可以同时浏览多个二元变量关系;数据点重叠的解决途径;通过添加第三个连续型变量,扩展到三维。
散点图矩阵:
pairs()函数
pairs(~ mpg + disp + drat + wt, data = mtcars, main = “basic scatter plot matrix”)
car包中的scatterplotMatrix()函数:
library(car) scatterplotMatrix( ~ mpg + disp + drat + wt, data = mtcars, spread = FALSE, lty.smooth = 2)
默认添加线性和平滑曲线,主对角线处添加核密度曲线和轴须图;spread选项设定是否添加展示分散度和对称信息的直线;lty.smooth设定拟合曲线使用的线形状。
另一个示例:
library(car) scatterplotMatrix( ~ mpg + disp + drat + wt | cyl, data = mtcars, spread = FALSE, diagonal = “histogram”)
gclus包中的cpairs()函数提供了一个散点图矩阵变种,可以重排矩阵中变量位置,让相关度更高的变量更靠近主对角线,并对各单元格进行颜色编码来展示变量间的相关性大小。这里将主对角线的核密度曲线改成了直方图,并且直方图是以cyl为条件绘制的。
library(gclus) mydata <- mtcars[c(1, 3, 5, 6)] mydata.corr <- abs(cor(mydata)) mycolors <- dmat.color(mydata.corr) myorder <- order.single(mydata.corr) cpairs(mydata, myorder, panel.colors = mycolors, gap = .5)
高密度散点图:数据点重叠的解决途径之一
smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图:
with(mydata, smoothScatter(x, y, main = “Scatterplot Colored by Smoothed Densities”))
hexbin包中的hexbin()函数将二元变量的封箱放到六边形单元格中:
library(hexbin) with(mydata, { bin <- hexbin(x, y, xbins = 50) plot(bin, main = “Hexagonal Bining with 10,000 Observations”) })
IDPmisc包中的iplot()函数可以通过颜色来展示点的密度(在某特定点上数据点的数目)
library(IDPmisc) with(mydata, iplot(x, y, main = “Image Scatter Plot with Color Indicating Density”))
三维散点图:
scatterplot3d包中的scatterplot3d()函数:
library(scatterplot3d) attach(mtcars) scatterplot3d(wt, disp, mpg, main = “Basic 3D Scatter Plot”)
旋转三维散点图:
rgl包中的plot3d()函数创建可交互的三维散点图。Rcmdr包中有类似的函数scatter3d()。
气泡图:
先创建一个二维散点图,然后用点的大小来代表第三个变量的值。注意默认为半径,如需使用面积需要进行变换。
symbols(x, y, circle = radius) #使用面积表示第三个值 symbols(x, y, circle = sqrt(z/pi))
折线图:
可用plot(x, y, type = )或者lines(x, y, type = )函数来创建
p |
只有点 |
l |
只有线 |
o |
实心点和线(即线覆盖在点上) |
b, c |
线连接点(c时不绘制点) |
s, S |
阶梯线 |
h |
直方图式的垂直线 |
n |
不生成任何点和线(通常用来为后面的命令创建坐标轴) |
相关图:
将相关系数矩阵进行可视化。corrgram包中的corrgram()函数:
library(corrgram) corrgram(mtcars, order = TRUE, lower.panel = panel.shade, upper.panel = panel.pie, text.panel = panel.txt)
上三角的单元格用饼图展示了相同的信息,同样的,蓝色表示正相关,红色表示负相关;相关性大小由被填充的饼图块的大小来展示;正相关性将从12点钟处开始顺时针填充饼图,负相关性则逆时针方向填充饼图。图形意义:默认情况下,下三角单元格中,蓝色和从左下指向右上的斜杠表示单元格中的两个变量呈正相关;红色和从左上指向右下的斜杠表示变量呈负相关;色彩越深,饱和度越高,变量相关性越大。
order = TRUE时相关矩阵将使用主成分分析法对变量重排序,可以使二元变量的关系模式更为明显。panel可以设定面板使用的元素类型:lower.panel和upper.panel设置主对角线下和上的元素类型;text.panel和diag.panel控制主对角线元素类型,详细值如下表:
位置 |
面板选项 |
描述 |
非对角线 |
panel.pie |
用饼图的填充比例表示相关性大小 |
panel.shade |
用阴影的深度来表示相关性大小 |
|
panel.ellipse |
绘制置信椭圆 |
|
panel.pts |
平滑拟合曲线绘制散点图 |
|
主对角线 |
panel.minmax |
输出变量的最大最小值 |
panel.txt |
输出变量的名字 |
马赛克图:
用于展示类别型变量间的关系。马赛克图中,嵌套矩形面积正比于单元格频率,其中该频率即多维列联表中的频率。颜色和阴影可表示拟合模型的残差值。常用vcd包中的mosaic()函数实现(比基础安装中的mosaicplot()函数有更多的扩展功能)。
图形中隐藏大量信息,可以关注各个矩形的相对宽度和高度来解释。颜色和阴影提供了拟合模型的残差值:蓝色代表在假定类别与条件无关的情况下,该类别的数量高于预期值,红色则相反。
=========================================================================
R中有四种图形系统:基础图形系统、grid图形系统、lattice包、ggplot2包。
lattice包:
通常格式:graph_function(formula, data = , options)
graph_function为函数名,formula指定要展示的变量和条件变量;data指定数据框;options是逗号分隔参数,修改格式等。
一般的,下表中小写字符代表数值型变量,大写字符代表类别型变量。
图形类型 |
函数 |
表达式示例 |
三维等高线图 |
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 |
options:
aspect |
数值,设定每个面板中图形的宽高比 |
col/pch/lty/lwd |
向量,分别设定图形中的颜色、符号、线条类型和线宽 |
Groups |
用来分组的变量(因子) |
index.cond |
列表,设定面板的展示顺序 |
key(或auto.key) |
函数,添加分组变量的图例符号 |
layout |
两元素数值型向量,设定面板的摆放方式(行数和列数); 如有需要,可以添加第三个元素,以指定页数 |
Main/sub |
字符型向量,设定主标题和副标题 |
Panel |
函数,设定每个面板要生成的图形 |
Scales |
列表,添加坐标轴标注信息 |
Strip |
函数,设定面板条带区域 |
Split/position |
数值型向量,在一页上绘制多幅图形 |
Type |
字符型向量,设定一个或多个散点图的绘图参数 (如p=点,l=线,r=回归,smooth=平滑曲线,g=格点) |
xlab/ylab |
字符型向量,设定横轴和纵轴标签 |
xlim/ylim |
两元素数值型向量,分别设定横轴和纵轴的最小和最大值 |
高级绘图中表达式的通常格式:
y ~ x | A * B
竖线左边的变量称为主要变量,右边称为条件变量。主要变量即为图形的两个坐标轴,其中y在纵轴上,x在横轴上。变形:单变量绘图,用 ~ x 即可;三维绘图,用z ~ x*y;多变量绘图,使用数据框代替y ~ x即可。
条件变量的用法:~ x | A表示因子A各个水平下数值型变量x的分布情况;y ~ x | A * B表示因子A和B各个水平组合下数值型变量x和y之间的关系。A ~ x表示A在纵轴上展示,x在横轴上展示。
条件变量为连续型变量时,要先将其转换成离散型变量。一种方法是使用cut()函数,另外可以使用lattice包中的函数将连续型变量转化为瓦块(shingle)数据结构,这样,连续型变量可以被分割为一系列(可能)重叠的数值范围。
myshingle <- equal.count(x, number = #, overlap = proportion) #连续型变量x将会被分割为#个区间,重叠度为proportion,每个区间内观测数相等
这样就可以使用这个变量作为条件变量了
分组变量:将每个条件变量产生的图形叠加到一起,在同一幅图中展示,只需要将条件变量放到绘图函数中的group声明中即可。
面板函数:自定义面板的各个选项,然后在绘制图形的函数中调用即可。
图形参数:查看默认的图形参数使用trellis.par.get()函数;修改这些参数使用trellis.par.set()函数;show.settings()函数可以展示当前的图形参数设置情况。
页面摆放:lattice无法使用par()函数,因此需要将图形存储到对象中,然后利用plot()函数中的split = 或position = 选项来进行控制。
#split方法 library(lattice) graph1 <- histogram(…) graph2 <- densityplot(…) plot(graph1, split = c(1,1,1,2)) plot(graph2, split = c(1,2,1,2), newpage = FALSE) #position方法 library(lattice) graph1 <- histogram(…) graph2 <- densityplot(…) plot(graph1, position = c(0, .3, 1, 1)) plot(graph2, position = c(0, 0, 1, .3), newpage = FALSE)
split的方法,将第一幅图放置到第二幅图的上面:第一个plot()函数把页面分割为一列两行的矩阵,并将图形放置到第一列第一行中;第二个plot()函数将图形放置到第一列第二行中,由于plot()函数默认启动新的页面,因此使用newpage = FALSE选项。position方法,设定坐标,原点位于页面左下角,x轴和y轴维度范围为(0, 1),position = (xmin, ymin, xmax, ymax)。
ggplot2包:
只介绍一种较为简单的绘图方式:qplot()函数
qplot(x, y, data = , color = , shape = , size = , alpha = , geom = , method = , fomula = , facets = , xlim = , ylim = , xlab = , ylab = , main = , sub = )
选项 |
描述 |
alpha |
元素重叠的alpha透明度,数值为0(完全透明)到1(完全不透明)间的分数 |
color/shape/size/fill |
把变量的水平与符号颜色、形状或大小联系起来,color为线的颜色,fill为填充颜色 |
data |
指定一个数据框 |
facets |
指定条件变量,创建一个栅栏图 |
geom |
设定定义图形类型的几何形状 |
main/sub |
字符向量,设定标题或副标题 |
method/formula |
若geom = “smooth”,则会默认添加一条平滑拟合曲线和置信区间,观测数大于1000时,需要调用更高效的平滑拟合算法,包括回归lm、广义可加模型gam、稳健回归rlm。formula指定拟合形式,注意formula = y ~ x使用的就是字母y和x而不是变量名。 对于method = “gam”要加载mgcv包,method = “rml”要加载MASS包 |
x/y |
指定摆放在水平轴和竖直轴的变量。对于单变量图形(如直方图),则省略y |
xlab/ylab |
字符向量,设定横轴和纵轴标签 |
xlim/ylim |
二元素数值型向量,分别指定横轴和纵轴的最小值和最大值 |
交互式图形:
主要介绍的软件包:playwith, latticist, iplots, rggobi
基础安装中的交互:鉴别点函数:identify()函数
plot(mtcars$wt, mtcars$mpg) identify(mtcars$wt, mtcars$mpg, labels = row.names(mtcars))
许多包中的图形函数都可以应用该方法进行标注,但是lattice或ggplot2图形无法使用该方法。
playwith包:
playwith()包允许用户识别和标注点、查看一个观测所有的变量值、缩放和旋转图形、添加标注(文本、箭头、线条、矩形、标题和标签)、修改视觉元素(颜色、文本大小等)、应用先前存储的图形风格,以及以多种格式输出图形结果。
playwith()既对R基础图形有效,也对lattice和ggplot2图形有效,但是并不是所有都可以用。
latticist包:
www.deducer.org
可以与playwith整合到一起:
library(latticist) mtcars$cyl <- factor(mtcars$cyl) mtcars$gear <- factor(mtcars$gear) latticist(mtcars, use.playwith = TRUE)
作用是可以通过栅栏图方式探索数据集。
iplots包:
http://rosuda.org/iplots/
playwith包和latticist包只能与单幅图形交互,而iplots包提供的交互方式则有所不同。该包提供了交互式马赛克图、柱状图、箱线图、平行坐标图、散点图和直方图,以及颜色刷,并可将他们结合在一起绘制。也就是说可通过鼠标对观测点进行选择和识别,并且对其中一幅图形的观测点突出显示时,其他被打开的图形将会自动突出显示相同的观测点。
ibar() |
交互式柱状图 |
ibox() |
交互式箱线图 |
ihist() |
交互式直方图 |
imap() |
交互式地图 |
imosaic() |
交互式马赛克图 |
ipcp() |
交互式平行坐标图 |
iplot() |
交互式散点图 |
roggobi包:
开源软件GGobi(www.ggobi.org)
用法:首先要下载该软件,然后在R中安装rggobi包,即可利用R中运行GGobi