R语言
R语言学习笔记——入门篇:第三章-图形初阶
一、使用图形
1.1、基础绘图函数:plot( )
R中是一种交互式绘图风格 plot( ) :最基础的图形绘制函数,其属于graphics包,会根据不同的数据类型形成不同的图形。语法
plot( a, b, type= "value" )
参数
type:以什么样的形式来画a,b之间的关系:
“p”:点; “l” :线; “c”:仅有线,但不连续,在本应画点的地方断开了; “b”:即有点又有线,点与线不相交; “o”:即有点又有线,点与线相交,(overplot); “h”:抽象成高密度的直方图; “n”:图上没有任何的点,即空图,no plotting. 其它格式
格式 注释 plot(x) 以x值为纵坐标,序号为横坐标绘图 plot(x,y) 以x值为横坐标,y值为纵坐标绘制散点图 plot(f) f是一个因子对象,产生f的直方图 plot(f,y) f是一个因子对象,y是数值向量,产生y在f各个水平下的箱线图 plot(data.frame) 产生数据框中各变量的分布图 plot(~x1+x2+x3) 对于形如x1+x2+x3的表列,产生各对象的分布图 plot(y~x1+x2+x3) y可以是任何对象,分别产生y对于x1,x2,x3各对象的图
函数 功能 bmp(“filename.bmp”) BMP文件 jpeg(“filename.jpg”) JPEG文件 pdf(“filename.pdf”) PDF文件 png(“filename.png”) PNG文件 postscript(“filename.ps”) PostScript文件 svg(“filename.svg”) SVG文件 win.metafile(“filename.wmf”) Windows图元文件
pdf( "mygraph.pdf" )
attach( x)
plot( a, b)
abline( lm( a~ b) )
title( "This is a title" )
detach( x)
dev.off
1.2、图形控制函数:dev( )
补充——直方图函数:hist( )
hist( ) :直方图通过在x轴上建立一定数量的组别,在y轴上显示对应组别的频数来展示数值向量的分布。语法
hist( x, ... )
参数 参数说明 breaks 设置每个柱形的间距,即柱宽,实际上就是x轴的等分数,所以breaks越大,柱形宽度越小 freq 若为FALSE,表示y轴(柱形高度)为密度而不是频率 probability 若为FALSE,表示y轴是频率而不是频数 xlim 设置横轴范围 ylim 设置纵轴范围 axes 是否需要画坐标轴 plot 是否需要画图 nclass 改变分类数 density和angle 设置柱形上的斜线密度和角度 border 设置柱形边界的颜色
补充——低级绘图函数:用来修饰图形
函数 功能 points( ) 添加点 lines( ) 添加线 segments( ) 添加线段 abline( ) 添加直线 arrows( ) 添加带箭头线段 polygon( ) 添加封闭多边形 text( ) 添加文字
二、示例
Sys.setenv( LANGUAGE = "en" )
options( stringsAsFactors = F)
rm( list = ls( ) )
setwd( "C:/Users/16748/Desktop" )
dose <- c( 20 , 30 , 40 , 45 , 60 )
drugA <- c( 16 , 20 , 27 , 40 , 60 )
drugB <- c( 15 , 18 , 25 , 31 , 40 )
a <- plot( dose, drugA, type = "b" )
结果:
三、利用par()函数与图形参数美化图形
R会尽可能的美化图形,但用户仍然可以使用图形参数来调整。 方法一:通过par( )函数修改
opar <- par( no.readonly = T)
par( lty = 2 , pch = 17 )
a <- plot( dose, drugA, type = "b" )
par( opar)
结果:
方法二:通过参数值修改
直接在plot时添加参数选项,这种情况下,指定的选项只对这幅图片生效 示例
plot( dose, drugA, type = "b" , main = "药物A剂量与响应的折线图" , xlab = "剂量" , ylab = "响应" , lty = 2 , pch = 17 )
3.1、符号与线条
参数 功能 pch 指定绘制点时使用的符号(具体见下图) cex 指定符号大小,默认值为1,2表示放大为默认值的两倍 lty 指定线条按类型 lwd 指定线条宽度,默认为1,lwd=2将生成2倍于默认值的线条(具体见下图)
3.2、颜色
参数 参数说明 col 默认的绘图颜色。某些函数(如line和pie)可以接受一个含有颜色值的向量并自动循环使用,例如col=c(“red”,“blue”),且需要绘制三条线,前两条分别为红,蓝,第三条会循环,变为红色 col.axis 坐标轴刻度文字的颜色 col.lab 坐标轴标签(名称)的颜色 col.main 标题颜色 col.sub 副标题颜色 fg 图形的前景色 bg 图形的背景色
调节颜色 :可以通过颜色下标,颜色名称,十六进制颜色,RGB值(红-绿-蓝)或HSV值(色相-饱和度-亮度值)来指定颜色
例如:col=1, col=“white”, col=“#FFFFFF”, col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色 查看颜色 :colors( ) 函数 ,查看所有可用颜色及其编号创建颜色型向量 :rainbow( ) , heat.colors( ) , terrain.colors( ) , topo.colors ( )和 cm.colors( ) 函数。
例如 rainbow(10) 就可以产生10种连续的颜色。 示例:brewer.pal(n,name)
install.packages( "RColorBrewer" )
library( RColorBrewer)
n <- 7
m <- 1
c <- brewer.pal( n, "Set1" )
barplot( rep( m, n) , col = c)
brewer.pal.info
display.brewer.all( )
多阶灰度色 :grary(n:m)函数 ,元素值为0-1
mycolors <- rainbow( m)
pie( rep( 1 , m) , labels = mycolors, col = mycolors)
mygrays <- gray( 0 : m/ m)
pie( rep( 1 , m) , labels = mygrays, col = mygrays)
3.3、文本属性
字号,字形,字样都可以用图形参数来调整 调节文本大小
参数 描述 cex 表示相对于默认大小缩放倍数的数值。默认大小为1,1.5 表示放大为默认值的1.5 倍,0.5 表示缩小为默认值的50%,等等 cex.axis 坐标轴刻度文字的缩放倍数。类似于cex cex.lab 坐标轴标签(名称)的缩放倍数。类似于cex cex.main 标题的缩放倍数。类似于cex cex.sub 副标题的缩放倍数。类似于cex
参数 描述 font 整数。用于指定绘图使用的字体样式。1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(以Adobe符号编码表示) font.axis 坐标轴刻度文字的字体样式 font.lab 坐标轴标签(名称)的字体样式 font.main 标题的字体样式 font.sub 副标题的字体样式 ps 字体磅值(1 磅约为1/72 英寸)。文本的最终大小为ps*cex family 绘制文本时使用的字体族。标准的取值为serif(衬线)、sans(无衬线)和mono(等宽)
字体族(格式)介绍与扩展 :Windows系统中,等宽字体映射为TT Courier New,衬线字体映射为TT Times New Roman,无衬线字体则映射为TT Arial(TT代表True Type)。
如果对这些映射满意,就可以使用类似于family="serif"这样的参数获得想要的结果。 或者直接创建新的映射。在Windows中,可以通过windowFont()来创建这类映射(在Mac,用quartzFonts( ))。 示例
windowsFonts(
A= windowsFont( "Arial Black" ) ,
B= windowsFont( "Bookamn Old Style" ) ,
C= windowsFont( "Comic Sans Ms" )
)
par( family= "A" )
输出时调整字体族 :如果以PDF或者PostScript格式输出图形,修改字体族会相对简单。
PDF
查找可用字体:names(pdfFonts()) 生成图形:pdf(file=“myplot.pdf”,family=“fontname”) PostScript
查找可用字体:names(postscriptFonts()) 生成图形:pdf(file=“myplot.ps”,family=“fontname”)
3.4、图形与边界尺寸
参数 描述 pin 以英寸表示的图形尺寸(宽和高),如c(4,3) mai 以数值向量表示的边界的大小,顺序为"下、左、上、右",单位是英寸 mar 以数值向量表示的边界的大小,顺序为"下、左、上、右",单位是英分。默认值是从c(5,4,4,2)+0.1
par( pin= c( 4 , 3 ) , mai= c( 1 , .5 , 1 , .2 ) )
四、添加标题,自定义坐标轴和图例
许多高级的绘图函数(plot,hist,boxplot等)都允许有设置坐标轴和文本标注的参数选项。 参数选项 :
标题:main 副标题:sub 坐标轴标签:xlab,ylab 坐标轴范围:xlim,ylim,如xlim=c(0,60) 示例 :
plot( dose, drugA, type = "b" , col = "red" ,
lty = 2 , pch = 2 , lwd = 2 , cex = .5 ,
main = "Clinical Trials for Drug A" ,
sub = "This is hypothetical data" ,
xlab = "Dosage" , ylab = "Drug Response" ,
xlim = c( 0 , 60 ) , ylim = c( 0 , 70 ) )
结果 : 注1 :不是所有函数都有这类选项注2 :有些函数已经包含了默认的标题和标签,需要在plot( )或者par( )中添加ann=FALSE来移除它们。
4.1、标题
函数 :title( ) 参数 :plot中适用于标题,坐标轴的参数类似添加文本,修改文本格式,修改大小颜色等都可以添加在title( )函数中
4.2、坐标轴
参数 描述 side 一个整数,指定在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右) at 一个数值型向量,表明刻度线绘制的位置 labels 一个字符型向量,表明置于刻度线旁边的标签(如果为NULL,则将直接使用at中的值) tick 一个逻辑值,表示是否画出坐标轴线和刻度线,默认为TRUE line 坐标轴距离边距的行数(用于改变所画的图和坐标轴之间的间隔),line=NA表示没有间隔 pos 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值) outer 一个逻辑值,设置坐标轴是否画在外部边距中,outer=FALSE表示把坐标轴画在标准边距中 font 文本的字体样式 lty 坐标轴线和刻度线的类型 lwd 坐标轴的线宽 lwd.ticks 刻度线的线宽 tck 刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为-0.01 col 坐标轴的颜色 col.ticks 刻度线的颜色 las 坐标刻度标签的方向。0表示总是平行于坐标轴,1表示总是水平的,2表示总是垂直于坐标轴
注 :在自定义坐标轴时,应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE 将禁用全部坐标轴(包括坐标轴框架线,除非添加了frame.plot=TRUE ).参数xaxt=“n” 和 yaxt=“n” 将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。示例:
x <- c( 1 : 10 )
y <- x
plot( x, y, type= "b" , pch= 21 , col= "red" , yaxt= "n" , lty= 3 , ann= FALSE )
axis( 2 , at= y, labels= round( y, digits = 2 ) , col.axis= "blue" , las= 2 , cex.lab= 1 , cex.axis= 0.7 , tck= - 0.01 )
结果 :
4.3、参考线
abline( a = NULL , b = NULL , h = NULL , v = NULL , ... )
abline( h = c( 1 , 5 , 7 ) , lty = 2 , col = "blue" )
abline( v = seq( 1 , 10 , 2 ) , lty = 1 , col = "green" )
结果
4.4、图例
legend( location, title, legend)
参数 描述 location 有许多方式可以指定图例的位置。1.可以直接给定图例左上角的x,y坐标(直接看坐标轴确认), 2.也可将此参数设置为locator(1),然后通过鼠标单击给出图例的位置, 3.还可以使用关键字"bottom"、“bottomleft”、“left”、 “topleft”、“top”、“topright”、“right”、 "bottomright"或"center"放置图例,如果使用了上述某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘图区域大小的分数表示) title 图例标题的字符串(可选) legend 图例标签所组成的字符型向量 fill 颜色值组成的向量,为图例创建颜色填充的盒形,(常见于条形图、箱线图或饼图) col 颜色值组成的向量,图例标示的是颜色不同的线条 pch 符号代码组成的向量,用于图例标示的是符号不同的点 lwd、lty 宽度值或类型值组成的向量,用于图例标示的是不同的线条宽度或线条类型 angle 阴影线的角度 density 阴影线的密度 bty 图例边框的类型 bg 图例边框的背景色 cex 指定大小 text.col 指定文本颜色 horizen=TRUE 水平放置图例 box.lwd 边框线的宽度 box.lty 边框线的类型 box.col 边框线的颜色
Sys.setenv( LANGUAGE = "en" )
options( stringsAsFactors = F)
rm( list = ls( ) )
setwd( "C:/Users/16748/Desktop" )
dose <- c( 20 , 30 , 40 , 45 , 60 )
drugA <- c( 16 , 20 , 27 , 40 , 60 )
drugB <- c( 15 , 18 , 25 , 31 , 40 )
x <- data.frame( dose, drugA)
opar <- par( no.readonly = TRUE )
png( "1.png" , width = 480 , height = 480 )
par( lwd= 2 , cex= 1.5 , font.lab= 2 )
plot( dose, drugA, type= "b" , pch= 15 , lty= 1 , col= 'red' , ylim = c( 0 , 60 ) ,
main= "Drug A vs. Drug B" ,
xlab= "Drug Dosage" , ylab= "Drug Response" )
lines( dose, drugB, type= "b" , pch= 17 , lty= 2 , col= "blue" )
abline( h= c( 30 ) , lwd= 1.5 , lty= 2 , col= "gray" )
library( Hmisc)
minor.tick( nx= 3 , ny= 3 , tick.ratio = 0.5 )
legend( 20 , 60 , title= "Drug Type" , c( "A" , "B" ) ,
lty= c( 1 , 2 ) , pch= c( 15 , 17 ) , col= c( "red" , "blue" ) )
text( dose, drugA, row.names( x) , cex= 0.9 , pos= 4 , offset = .3 , col= "red" )
dev.off( )
结果 :
4.5、文本标注
函数 :text( ), mtext( )
text( ): 向绘图区域内部添加文本 mtext( ): 向图形的四个边界之一添加文本 语法 :
text( location, "text to place" , pos, ... )
mtext( "text to place" , side, line= n, ... )
选项 描述 location 文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置 pos 文本相对于参数位置的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定offset=作为偏移量,以相对于单个字符宽度的比例表示。 side 指定用来放置文本的边。1=下,2=左,3=上,4=右。可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可用adj=0将文本向左下对齐,或使用adj=1右上对齐 cex 调整字号 col 调整颜色 font 调整字体样式
x <- data.frame( dose, drugA)
text( dose, drugA, row.names( x) , cex= 0.9 , pos= 4 , offset = .3 , col= "red" )
locator( n, type, ... )
4.6、数学标注
函数 : plotmath( )
可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。
补充——次要刻度线
函数 :minor.tick( ) ,Hmisc包语法 :
minor.tick( nx= n, ny= n, tick.ratio= n)
minor.tick( nx= 2 , ny= 3 , tick.ratio= 0.5 )
补充——网格线
grid( nx= number1, ny= number2)
grid( nx= 5 , ny= 5 , col= "grey" , lty= 2 , lwd= 2 )
五、图形的组合
将一副图片的空间按行(列)划分为多个窗格,将多幅图片拼接起来 拼接方法 :par( )函数, layout( )函数
5.1、par( )函数
mfrow= c( nrows, ncols)
mfcol= c( nrows, ncols)
Sys.setenv( LANGUAGE = "en" )
options( stringsAsFactors = F)
rm( list = ls( ) )
setwd( "C:/Users/16748/Desktop" )
png( "1.png" , width = 480 , height = 480 )
opar <- par( no.readonly = TRUE )
par( mfrow= c( 2 , 2 ) )
dose <- c( 20 , 30 , 40 , 45 , 60 )
drugA <- c( 16 , 20 , 27 , 40 , 60 )
drugB <- c( 15 , 18 , 25 , 31 , 40 )
plot( dose, drugA, type = "b" , main = "药物A剂量与响应的折线图" , xlab = "剂量" , ylab = "响应" )
plot( dose, drugB, type = "b" , main = "药物B剂量与响应的折线图" , xlab = "剂量" , ylab = "响应" )
hist( dose, main= "Histogram of dose" )
boxplot( dose, main= "Boxplot of dose" )
par( opar)
dev.off( )
结果 :
5.2、layout( )函数
图形参数 :创建一个矩形matrix( ) 来划分区间,widths,heights 参数来调整区间大小。
layout( matrix( vector, nrow = number_of_rows, ncol = number_of_columns , byrow = TRUE / FALSE , dimnames = list( rownames, colnames) ) , widths= c( ) , heights= c( ) )
Sys.setenv( LANGUAGE = "en" )
options( stringsAsFactors = F)
rm( list = ls( ) )
setwd( "C:/Users/16748/Desktop" )
png( "1.png" , width = 480 , height = 480 )
layout( matrix( c( 1 , 1 , 2 , 3 ) , 2 , 2 , byrow = TRUE ) , widths = c( 3 , 1 ) , heights = c( 1 , 2 ) )
dose <- c( 20 , 30 , 40 , 45 , 60 )
drugA <- c( 16 , 20 , 27 , 40 , 60 )
drugB <- c( 15 , 18 , 25 , 31 , 40 )
hist( dose)
hist( drugA)
hist( drugB)
dev.off( )
结果 :
5.3、图形布局的精细控制
图形参数 :fig( ) 原理 : fig( )会创建一个完整的绘图空间(所以要确保添加new=TRUE参数),左下角为(0,0),右上角为(1,1),fig( )形如一个c(x1,x2,y1,y2)的数值向量 示例 :
Sys.setenv( LANGUAGE = "en" )
options( stringsAsFactors = F)
rm( list = ls( ) )
setwd( "C:/Users/16748/Desktop" )
png( "1.png" , width = 480 , height = 480 )
opar <- par( no.readonly = TRUE )
dose <- c( 20 , 30 , 40 , 45 , 60 )
drugA <- c( 16 , 20 , 27 , 40 , 60 )
drugB <- c( 15 , 18 , 25 , 31 , 40 )
par( fig = c( 0 , 0.8 , 0 , 0.8 ) )
plot( dose, drugA, type = "b" , main = "药物A剂量与响应的折线图" , xlab = "剂量" , ylab = "响应" )
par( fig = c( 0 , 0.8 , 0.55 , 1 ) , new = T)
boxplot( drugA, horizontal = T, axes = F)
par( fig = c( 0.65 , 1 , 0 , 0.8 ) , new = T)
boxplot( drugB, horizontal = T, axes = F)
mtext( "Enhanced Scatterplot" , side= 3 , outer= T, line= - 3 )
par( opar)
dev.off( )
结果 :