本系列是一个新的系列,在此系列中,我将和大家共同学习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. 浅析Asp.Net Core框架IConfiguration配置

    目录 一.建造者模式(Builder Pattern) 二.核心接口与配置存储本质 三.简易QueryString配置源实现 四.宿主配置与应用配置 一.建造者模式 为什么提建造者模式?在阅读.NET ...

  2. (Shell)Shell命令整理

    目录 常用命令 1. 上传.下载 2. 删除文件和文件夹 3. 目录操作 4. 文件的操作 4.vim 为新添加的文件后缀支持语法高亮 常用命令 1. 上传.下载 上传文件:rz,然后回车弹出上传文件 ...

  3. memset 在c++中使用细节注意

    C语言,在利用struct进行数据封装时,经常会使用memset(this,0,sizeof(*this))来初始化.而C++中,有时候也会用到struct,在利用memset进行初始化时,非常容易踩 ...

  4. TypeScript基本类型

    类型注解 作用:相当于强类型语言中的类型声明 语法:(变量/函数):type 数据类型 新建src/datatype.ts,里面定义各种类型的数据 原始类型: let bool: boolean = ...

  5. Redis集群数据没法拆分时的搭建策略

    在上一篇文章中,针对服务器单点.单例.单机存在的问题: 单点故障 容量有限 可支持的连接有限(性能不足) 提出了解决的办法:根据AKF原则搭建集群,大意是先X轴拆分,创建单机的镜像,组成主主.主备.主 ...

  6. Java内存溢出处理

    在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识. jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区 ...

  7. Spring框架——JDBC方式搭建项目

    学习Spring框架,使用JDBC的方式配置方式搭建一个项目,进行项目总结. 首先,采用MVC设计模式思想,搭建项目目录. 然后各个目录文件下面的相关源码附上: controller目录: impor ...

  8. DolphinScheduler 源码分析之 DAG类

    1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license ...

  9. Pytest(10)assert断言

    前言 断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试 failed ...

  10. HDU6370 Werewolf 【基环内向树】

    HDU6370 Werewolf 题意: 有\(N\)个人玩狼人杀,只有村民和狼人,每个人指定另一个人并指出一个身份,其中:村民是不会说谎的,狼人是有可能说谎的,问在所有情况下必然是狼人的人数和必然是 ...