本系列是一个新的系列,在此系列中,我将和大家共同学习R语言。由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成。

参考教材:《R语言实战》第二版(Robert I.Kabacoff),书中所提到的John Cook的优秀博文,关于代码规范的《来自Google的R语言编码风格指南》。

Part 1:图形参数

Unit 1:点型和线型

plot()是R中为对象作图的一个泛型函数,它的输出由所绘制对象的类型不同而不同。如果xy是两个等长的数字向量,则以下代码将绘制点集\((x,y)\),并用线段将其连接。

plot(x, y, type="b")

这里type="b"代表同时绘制点和线。还有以下的几种type属性的选择:

  • "p":只绘制点,不绘制线段。
  • "l":只绘制线段,不绘制点。
  • "b":绘制点和线,但实线不通过点。
  • "o":绘制点和线,且实线会通过点,与"b"的视觉效果不同。
  • "h":只绘制各点到\(x\)轴的竖线,不绘制点和线。
  • "s":绘制阶梯型曲线。
  • "S":绘制阶梯型区间,但是阶梯方向不同。
  • "n":不绘制任何点、线。

在使用plot()作图之前,可以使用par()函数修改图形的参数,这个函数可以任意次调用。在使用par()修改图形参数之前,往往会加入以下两句:

opar <- par(no.readonly=TRUE)
...
par(opar)

当调用par(opar)后,将还原默认参数环境

以下是用于指定符号和线条类型的参数:

  • pch:指定绘制点时使用的符号,范围是\(\{0,1,\cdots,25\}\)。
  • cex:指定符号的大小,表示绘图符号相对于默认大小的缩放倍数,默认值是1。
  • lty:指定线条类型,范围是\(\{1,2,\cdots,6\}\)。
  • lwd:指定线条宽度,表示之于默认值的相对粗细,默认值是1。

也可以直接在plot处加上这四个参数:

plot(x, y, type="b", pch=11, lty=2, cex=2, lwd=2)

Unit 2:颜色

以下是用于指定颜色的参数:

  • col:默认的绘图颜色,可以传入一个向量并循环使用。
  • col.axis:坐标轴刻度文字的颜色。
  • col.lab:坐标轴标签文字的颜色。
  • col.main:标题颜色。
  • col.sub:副标题颜色。
  • fg:图形前景色,如坐标轴线。
  • bg:图形背景色。

颜色的指定,可以用颜色下标、颜色名字、十六进制颜色值、RGB值、HSV值来指定,函数colors()可以返回所有可用颜色的名称(657种)。

可以用rainbow(n)创建一个\(n\)种连续的彩虹形颜色列表,可以用gray(vector)来获得一个灰度色列表,常用的vector=0:n/n,是一个\([0,1]\)之间的均匀列表。

RColorBrewer是一个用于创建颜色的常用包,其中brewer.pal(n, name)可以从调色盘name中创建一个颜色值的向量,以下程序段是一个brewer.par()函数的使用示例。

library(RColorBrewer)
n <- 9
mycolor <- brewer.pal(n, "Set1") # 使用的颜色集合是"Set1"
barplot(rep(1,n), col = mycolor)

可以使用display.brewer.all()显示所有调色板的颜色,或者display.brewer.pal(name)显示某个调色板的颜色。brewer.pal.info命令可以给出所有调色板的列表。

Unit 3:文本

字体族和字样通过以下参数进行控制。

  • cex:相对默认大小的缩放倍数,默认值是1(代表以下一类,不要直接调用)。
  • cex.axis:坐标轴刻度文字的缩放倍数。
  • cex.lab:坐标轴标签的缩放倍数。
  • cex.main:标题的缩放倍数。
  • cex.sub:副标题的缩放倍数。
  • font:整数,指定字体样式。\(\{1,2,3,4,5\}\)分别代表常规、粗体、斜体、粗斜体、符号字体(代表以下一类,不要直接调用)。
  • font.axis:坐标轴刻度文字的字体样式。
  • font.lab:坐标轴标签的字体样式。
  • font.main:标题的字体样式。
  • font.sub:副标题的字体样式。
  • ps:字体磅值,文本的最终大小为ps*cex
  • family:绘制文本时使用的字体族,标准取值为serif(衬线)、sans(无衬线)、mono(等宽)。

字体族的设置稍显复杂,在Windows系统中mono映射为TT Courier New,sarif映射为TT Times New Roman,sans映射为TT Arial,这里TT指True Type。如果想要使用其他字体,需要创建新的映射,使用windowsFonts()windowsFont()来创建。

x <- c(20, 30, 40, 45, 60)
y <- c(16, 20, 27, 40, 60) windowsFonts(
A=windowsFont("Arial Black"),
B=windowsFont("Bookman Old Style"),
C=windowsFont("Comic Sans MS")
) par(pch=17, lty=6, cex=2, lwd=3) # 注意cex参数也会对文本产生影响
par(col='red')
par(font.main=4, family="C", ps=6) plot(x, y, type="b", main="A Simple Try")

Unit 4:图形尺寸与边界尺寸

控制图形尺寸和边界大小的参数为:

  • pin:以英寸表示的图形尺寸,是一个二元列表(宽和高)。
  • mai:以数值向量表示的边界大小,单位为英寸(下、左、上、右)。
  • mar:以数值向量表示的边界大小,单位为英分(下、左、上、右)。

Part 2:添加要素

Unit 1:添加标题和坐标轴标签

添加标题和坐标轴标签:使用title()函数,其调用格式为

title(main="main title",
sub="subtitle",
xlab="x-axis label",
ylab="y-axis label")

可以在title()函数中添加其他图形参数,如col.maincol.labcex.lab等。

Unit 2:添加个性化坐标轴

如果要添加个性化的坐标轴,通常要在plot()函数中设置一些图形参数:

  • ann:取FALSE时,将不会画出标题,包括主标题和副标题。
  • bty:设置边框样式,默认为"o"表示全部画出,还有"l"(左下)、"7"(右上)、"c"(上下左)、"u"(左下右)、"]"(上下右)、"n"(无)。
  • xaxsyaxs:设置\(x, y\)轴的范围,默认为"r"表示比范围略大,"i"表示和给定作图范围完全相同。
  • xaxtyaxt:可以取"n",此时坐标轴、刻度线和刻度值将不会画出。
  • axes:如果取FALSE,则所有坐标轴和框线都不会被画出。

添加自定义的坐标轴:使用axis()函数,其调用格式为

axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)

各个参数的释义为

  • side:\(\{1,2,3,4\}\),表示在图形的哪一边绘制坐标轴(下、左、上、右)。
  • at:数值型向量,表示需要绘制刻度线的位置。
  • labels:字符型向量,刻度线旁的文字标签,如果缺省则直接使用at中的值。
  • pos:坐标轴线绘制位置的坐标。
  • lty:线条类型。
  • col:线条和刻度线颜色。
  • las:标签平行于坐标轴=0,垂直于坐标轴=2
  • tck:刻度线的长度,以相对于绘图区域大小的分数表示,默认为-0.01,负值表示在图形外侧。
x <- c(20, 30, 40, 45, 60)
y <- c(16, 20, 27, 40, 60) windowsFonts(
A=windowsFont("Arial Black"),
B=windowsFont("Bookman Old Style"),
C=windowsFont("Comic Sans MS")
) par(pch=17, lty=6, cex=1, lwd=3)
par(col='red')
par(font.main=2, family="C", ps=12) plot(x, y, type="b", main="A Simple Try", yaxt="n") z <- c(20, 21, 22, 23, 24, 26, 28, 30, 35, 42, 50, 60)
axis(4, at=z, labels=z, col.axis='blue', pos=50, las=2, lty=2, tck=-0.02, )

Unit 3:添加图例和参考线

要添加参考线,应当使用abline()函数,其使用格式为

abline(h=yvalues, v=xvalues)

这里h代表添加水平参考线的高度位置,v代表添加垂直参考线的水平位置。可以在其中添加其他图形参数。

要添加图例,应当使用legend()函数,其使用格式为

legend(location, title, legend, ...)
  • location:指定图例的位置,可以给定图例左上角的\(x,y\)坐标,也可以使用locator(1)用鼠标点击,还可以使用bottom, bottomleft, left, topleft, top, topright, right, bottomright, center等关键字。
  • title:图例标题的字符串。
  • legend:图例标签组成的字符型向量。

以下给出书上的案例:

rm(list=ls())
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40) opar <- par(no.readonly = T) 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=30, lwd=1.5, lty=2, col="gray") library(Hmisc)
minor.tick(nx=3, ny=3, tick.ratio=0.5) # 添加次要刻度线 legend("topleft", inset=0.05, title="Drug Type", c("A", "B"),
lty=c(1, 2), pch=c(15, 17), col=c("red", "blue")) par(opar)

Unit 4:添加辅助文本

文本添加可以通过函数函数text(),向图形内部(通常是各个点)添加文本,使用格式为

text(location, "text to place", pos, ...)
  • location:文本的位置参数,可以是一对\((x, y)\)坐标,也可以通过location=locator(1)用鼠标来确定摆放位置。
  • pos:文本相对于位置参数的方位,\(\{1,2,3,4\}\)代表下、左、上、右。还可以追加指定参数offset作为偏移量。

还可以通过mtext()向图形的四个边界之一添加文本,使用格式为

mtext("text to place", side, line=n, ...)
  • side:指定摆放文本的边,\(\{1,2,3,4\}\)代表下、左、上、右。
  • line:内移或外移文本,值越大,文本外移的程度越大。
  • adj:文本可以向左下对齐=0,或向右上对齐=1

Part 3:图形组合

规则排布:可以使用par()函数中的图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。以下案例书上的实例代码,数据集为R语言内置的mtcars

rm(list=ls())

opar <- par(no.readonly = T)

par(mfrow=c(2, 2))  # 将绘图区域分成四块
attach(mtcars)
plot(wt, mpg, main="Scatterplot of wt vs. mpg") # 第一个图
plot(wt, disp, main="Scatterplot of wt vs. disp") # 第二个图
hist(wt, main="Histogram of wt") # 第三个图
boxplot(wt, main="Boxplot of wt") # 第四个图
detach(mtcars)
par(opar)

复杂排布:可以使用layout(matrix)函数来组合图形,这里matrix给定了图形的所在位置,如

\[\begin{pmatrix}
1 & 1 \\
2 & 3
\end{pmatrix}
\]

就代表第一幅图位于第一行的1、2列,第二幅图位于第二行第一列,第三幅图位于第二行第二列。

rm(list=ls())
opar <- par(no.readonly = T)
attach(mtcars) mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T)
layout(mat) # 按照mat矩阵给出划分
hist(wt, main = "Graph_1")
hist(mpg, main = "Graph_2")
hist(disp, main = "Graph_3") detach(mtcars)
par(opar)

为了精细控制每幅图形的相对大小,可以在layout()函数中使用widthsheights两个参数,它们分别是各列宽度值构成的向量与各行宽度值构成的向量。现在,在上述代码中加入这两个参数。

rm(list=ls())
opar <- par(no.readonly = T)
attach(mtcars) mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T)
layout(mat, widths = c(3, 1), heights = c(1, 1.5)) # 按照mat矩阵给出划分
hist(wt, main = "Graph_1")
hist(mpg, main = "Graph_2")
hist(disp, main = "Graph_3") detach(mtcars)
par(opar)

精细控制:可以使用par()函数的参数fig来精细控制,它接受四个\([0,1]\)之间的数,分别代表图形在窗口内所占有矩形的四个端点。一般还要加入new=TRUE,使得新加入的图形与原图形位于同样的画布中。

注意,如果遇到Error in plot.new(): figure margins too large,则应当修改参数,这是因为由于设备的原因,子图所需的大小与设置的参数冲突了。

R语言学习2:绘图的更多相关文章

  1. R语言学习笔记(五)绘图(1)

      R是一个惊艳的图形构建平台,这也是R语言的强大之处.本文将分享R语言简单的绘图命令.   本文所使用的数据或者来自R语言自带的数据(mtcars)或者自行创建.   首先,让我们来看一个简单例子: ...

  2. R语言学习笔记2——绘图

    R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, ...

  3. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  4. R语言基础画图/绘图/作图

    R语言基础画图/绘图/作图 R语言基础画图 R语言免费且开源,其强大和自由的画图功能,深受广大学生和可视化工作人员喜爱,这篇文章对如何使用R语言作基本的图形,如直方图,点图,饼状图以及箱线图进行简单介 ...

  5. R语言学习路线和常用数据挖掘包(转)

    对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑到论坛上吼一嗓子,然后欣然or悲伤的离去,一直到遇到下一个问题再回来.当然,这不是最好的学习方式,最好的方式是——看书.目前,市面上介绍R语言的 ...

  6. R语言学习 第一篇:变量和向量

    R是向量化的语言,最突出的特点是对向量的运算不需要显式编写循环语句,它会自动地应用于向量的每一个元素.对象是R中存储数据的数据结构,存储在内存中,通过名称或符号访问.对象的名称由大小写字母.数字0-9 ...

  7. R语言学习笔记:基础知识

    1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) ...

  8. R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//")> setwd("e:\桌面\")> s ...

  9. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

随机推荐

  1. Typora+PicGo+Gitee打造图床

    前言 ​ 自己一直使用的是Typora来写博客,但比较麻烦的是图片粘贴上去后都是存储到了本地,写好了之后放到博客园等地,图片不能直接访问,但如今Typora已经支持图片上传,所以搞了一波图片上传到Gi ...

  2. 从零开始学spring源码之xml解析(二):默认标签和自定义标签解析

    默认标签: 上一篇说到spring的默认标签和自定义标签,发现这里面东西还蛮多的.决定还是拆开来写.今天就来好好聊聊这两块是怎么玩的,首先我们先看看默认标签: private void parseDe ...

  3. Java语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 ...

  4. 前端面试之HTTP状态码!

    前端面试之HTTP协议的东西! 一次HTTP请求的流程! HTTP 状态码 成功响应(200–299) 状态码 含义 200 请求成功 201 该请求已成功,并因此创建了一个新的资源.这通常是在POS ...

  5. JavaScript小案例-阶乘!

    JavaScript小案例-阶乘! 阶乘:就是像台阶一样一阶一阶的,从高阶到低阶,依次乘下来!代码超少!容易理解! // factorial 阶乘 // 如果 function factorial(n ...

  6. 解决Spirng注入时名称下的红色波浪线

    解决Spirng注入时名称下的红色波浪线 报错情形: 解决办法: 方案一: 如果可以正常运行,那么可能是类没有交给Spring管理,如下图,我们只需要在对应的接口(或者类上)加上@Component注 ...

  7. Git提交代码规范 而且规范的Git提交历史,还可以直接生成项目发版的CHANGELOG(semantic-release)

    Git提交代码规范 - 木之子梦之蝶 - 博客园 https://www.cnblogs.com/liumengdie/p/7885210.html Commit message 的格式 Git 每次 ...

  8. file descriptor 0 1 2 一切皆文件 stdout stderr stdin /dev/null 沉默是金 pipes 禁止输出 屏蔽 stdout 和 stderr 输入输出重定向 重定向文件描述符

    movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 ... movie.mpeg.099   $cat movie.mpeg.0*>movie.mpeg   ...

  9. Redis击穿、穿透、雪崩产生原因以及解决思路

    击穿 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉.需要注意的是,无论是击穿还是 ...

  10. LOJ10159旅游规划

    题目描述 W 市的交通规划出现了重大问题,市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流.但由于人员不足,W 市市长决定只在最需要安排人员的路口安排人员. 具体来说,W 市的交通网络十分简 ...