R语言
R语言学习笔记——入门篇:第三章-图形初阶
文章目录
- R语言
- 一、使用图形
-
- 1.1、基础绘图函数:plot( )
- 1.2、图形控制函数:dev( )
- 补充——直方图函数:hist( )
- 补充——低级绘图函数:用来修饰图形
- 二、示例
- 三、利用par()函数与图形参数美化图形
-
- 3.1、符号与线条
- 3.2、颜色
- 3.3、文本属性
- 3.4、图形与边界尺寸
- 四、添加标题,自定义坐标轴和图例
-
- 4.1、标题
- 4.2、坐标轴
- 4.3、参考线
- 4.4、图例
- 4.5、文本标注
- 4.6、数学标注
- 补充——次要刻度线
- 补充——网格线
- 五、图形的组合
-
- 5.1、par( )函数
- 5.2、layout( )函数
- 5.3、图形布局的精细控制
一、使用图形
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()
- 结果: