《R语言实战》第3章
Posted starjuly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《R语言实战》第3章相关的知识,希望对你有一定的参考价值。
# 3.1 实用图形
# 绑定数据框mtcars
attach(mtcars)
# 打开了一个图形窗口并生成了一幅散点图,横轴表示车身重量,纵轴为每加仑汽油行驶的英里数
plot(wt, mpg)
# 向图形添加了一条最优拟合曲线
abline(lm(mpg~wt))
# 添加 了标题
title("Regression of MPG on Weight")
# 为数据框解除了绑定
detach(mtcars)
getwd()
setwd("/Users/moxingjian/Learn/R/test")
# 保存到pdf中
pdf("test.pdf")
attach(mtcars)
plot(wt, mpg)
abline(lm(mpg~wt))
title("Regression of MPG on Weight")
detach(mtcars)
dev.off()
# 3.2 一个简单的例子
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
# type="b"表示同时绘制点和线
plot(dose, drugA, type = "b")
# 3.3 图形参数
# (修改图形参数的)一种方法是通过函数par()来指定这些选项。以这种方式设定的参数值除非被再次修改,否则将在会话结束前一直有效
# 更改当前变量环境
opar <- par(no.readonly = TRUE)
# 将默认的线条类型修改为虚线(lty=2)并将默认的点符号改为了实心三角(pch=17)
par(lty = 2, pch = 17)
plot(dose, drugA, type = "b")
# 还原了原始设置
par(opar)
# 设置参数
plot(dose, drugB, type = "b", lty = 2, pch = 17)
# 3.3.1 符号和线条
# pch:指定绘制点时使用的符号,有0~25种符号,对于符号21~25,还可以指定边界颜色(col=)和填充色(bg=)。
# cex:指定符号的大小。cex是一个数值,表示绘图符号相对于默认大小的缩放倍数。默认大小为1,1.5表示放大为默认值的1.5倍,0.5表示缩小为默认值的50%,等等
# lty:指定线条类型
# lwd:指定线条宽度。lwd是以默认值的相对大小来表示的(默认值为1)。例如,lwd=2将生成一条两倍于默认宽度的线条
# 实战
plot(dose, drugA, type = "b", pch = 22, col = "red", bg = "black", cex = 2, lty = 3, lwd = 2)
# 3.3.2 颜色
# col:默认的绘图颜色。某些函数(如lines和pie)可以接受一个含有颜色值的向量 并自动循环使用。例如,如果设定col=c("red", "blue")并需要绘制三条线, 则第一条线将为红色,第二条线为蓝色,第三条线又将为红色
# col.axis:坐标轴刻度文字的颜色
# col.lab:坐标轴标签(名称)的颜色
# col.main:标题颜色
# col.sub 副标题颜色
# fg:图形的前景色
# bg:图形的背景色
n <- 10
# rainbow(10)可以生成10种连续的“彩虹型”颜色
mycolors <- rainbow(n)
# 画出来
pie(rep(1, n), labels = mycolors, col = mycolors)
# 多阶灰度 色可使用gray()函数生成。这时要通过一个元素值为0和1之间的向量来指定各颜色的灰度。 gray(0:10/10)将生成10阶灰度色
mygrays <- gray(0:n/n)
pie(rep(1, n), labels = mygrays, col = mygrays)
# 3.3.3 文本属性
# 用于指定文本大小的参数
# cex:表示相对于默认大小缩放倍数的数值。默认大小为1,1.5表示放大为默认值的1.5 15 倍,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 (等宽)
# 举例,在执行以下语句之后创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体、2倍于默认文本大小的标题。
par(font.lab = 3, cex.lab = 1.5, font.main = 4, cex.main = 2)
quartzFonts("mono")
quartzFonts(sans = quartzFont(rep("AppleGothic", 4)),
serif = quartzFont(rep("AppleMyungjp", 4)))
# 找出你的系统中有哪些字体是可用的
names(pdfFonts())
# 使用字体
pdf(file = "myplot.pdf", family = "serif")
# PostScript
names(postscriptFonts())
postscript(file = "myplot.ps", family = "Korea1")
# 3.3.4 图形尺寸与边界尺寸
# 用于控制图形尺寸和边界大小的参数
# pin:以英寸表示的图形尺寸(宽和高)
# mai:以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸
# mar:以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分*。默认值为c(5, 4, 4, 2) + 0.1
# 可生成一幅4英寸宽、3英寸高、上下边界为1英寸、左边界为0.5英寸、右边界为0.2英寸的图形
par(pin = c(4, 3), mai = c(1, .5, 1, .2))
# 代码清单3-1 使用图形参数控制图形外观
opar <- par(no.readonly = TRUE)
# 得到的图形将为2英寸宽、3英寸高。
par(pin = c(2, 3))
# 除此之 外,线条的宽度将为默认宽度的两倍,符号将为默认大小的1.5倍。
par(lwd = 2, cex = 1.5)
# 坐标轴刻度文本被设置为斜体、缩小为默认大小的75%
par(cex.axis = .75, font.axis = 3)
# 使用红色实心圆圈和虚线创建了第一幅图形
plot(dose, drugA, type = "b", pch = 19, lty = 2, col = "red")
# 使用绿 色填充的绿色菱形加蓝色边框和蓝色虚线创建了第二幅图形
plot(dose, drugB, type = "b", pch = 23, lty = 6, col = "blue", bg = "green")
# 还原了初始的图形参数 设置。
par(opar)
# 3.4 添加文本、自定义坐标轴和图例
#在图形上添加了标题(main)、副标题(sub)、坐标轴标签(xlab、ylab)并指定了坐标轴范围(xlim、ylim)。
plot(dose, drugA, type = "b",
col = "red", lty = 2, pch = 2, lwd = 2,
main = "Clinical Trials for Drug A",
sub = "This is hypothetical data",
xlab = "Dosage", ylab = "Drug Response",
xlim = c(0, 60), ylim = c(0, 70))
#3.4.1 标题
# 可以使用title()函数为图形添加标题和坐标轴标签。
# 函数title()中亦可指定其他图形参数(如文本大小、字体、旋转角度和颜色)。
# 举例来说,以下代码将生成红色的标题和蓝色的副标题,以及较默认大小小25%的绿色x轴、y轴标签:
title(main = "My Title", col.main = "red",
sub = "My Sub-title", col.sub = "blue",
xlab = "My X label", ylab = "My Y label",
col.lab = "green", cex.lab = 0.75
)
# 3.4.2 坐标轴
# 坐标轴选项
# side:一个整数,表示在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右)
# at:一个数值型向量,表示需要绘制刻度线的位置
# labels:一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值)
# pos:坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)
# lty:线条类型
# col:线条和刻度线颜色
# las:标签是否平行于(=0)或垂直于(=2)坐标轴
# tck:刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,0表示禁用刻度,1表示绘制网格线);默认值为0.01
# 创建自定义坐标轴时,你应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE将禁 用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt="n"和 yaxt="n"将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。
# 代码清单3-2 自定义坐标轴的示例
# 生成数据
x <- c(1:10)
y <- x
z <- 10/x
# 更改当前变量环境
opar <- par(no.readonly = TRUE)
# 增加边界大小
par(mar = c(5, 4, 4, 8) + 0.1)
# 绘制x对y的图形
plot(x, y, type = "b",
pch = 21, col = "red",
yaxt = "n", lty = 3, ann = FALSE)
# 添加x对1/x的直线
lines(x, z, type = "b", pch = 22, col ="blue", lty = 2)
# 绘制自己的坐标轴
axis(2, at = x, labels = x, col.axis = "red", las = 2)
axis(4, at = z, labels = round(z, digits = 2),
col.axis = "blue", las = 2, cex.axis = 0.7, tck = -.01)
# 添加标题和文本
mtext("y = 1/x", side = 4, line = 3, cex.lab = 1, las = 2, col = "blue")
title("An Example of Creative Axes",
xlab = "X Values",
ylab = "Y = X")
# 还原
par(opar)
# 次要刻度线
install.packages("Hmisc")
library(Hmisc)
# 格式
# 其中nx和ny分别指定了X轴和Y轴每两条主刻度线之间通过次要刻度线划分 得到的区间个数。tick.ratio表示次要刻度线相对于主刻度线的大小比例。当前的主刻度线长 度可以使用par("tck")获取
# minor.tick(nx = n, ny = n, tick.ratio = n)
# 下列语句将在X轴的每两条主刻度线之间添加1条次要刻度线,并在Y轴的每两条主刻度线之间添加2条次要刻度线
minor.tick(nx = 2, ny = 3, tick.ratio = 0.5)
# 3.4.3 参考线
# 使用格式:abline(h = yvalues, v = xvalues)
# 在y为1、5、7的位置添加了水平实线
abline(h = c(1, 5, 7))
# 在x为1、3、5、7、9的位置添加了垂直的蓝色虚线
abline(v = seq(1, 10, 2), lty = 2, col = "blue")
# 3.4.4 图例
# 使用格式为:lgend(location, title, legend, ...)
# 图例选项
# location:有许多方式可以指定图例的位置。你可以直接给定图例左上角的x、y坐标,也可以执行 locator(1),然后通过鼠标单击给出图例的位置,还可以使用关键字bottom、bottomleft、 left、topleft、top、topright、right、bottomright或center放置图例。如果你使用 了以上某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘图区域大小的分数表示)
# title:图例标题的字符串(可选)
# legend:图例标签组成的字符型向量
# ...:其他选项。如果图例标示的是颜色不同的线条,需要指定col=加上颜色值组成的向量。如果图例 标示的是符号不同的点,则需指定pch=加上符号的代码组成的向量。如果图例标示的是不同的线 条宽度或线条类型,请使用lwd=或lty=加上宽度值或类型值组成的向量。要为图例创建颜色填 充的盒形(常见于条形图、箱线图或饼图),需要使用参数fill=加上颜色值组成的向量
# 其他常用的图例选项包括用于指定盒子样式的bty、指定背景色的bg、指定大小的cex,以 及指定文本颜色的text.col。指定horiz=TRUE将会水平放置图例,而不是垂直放置。
# 代码清单3-3 依剂量对比药物A和药物B的响应情况
opar <- par(no.readonly = TRUE)
# 增加线条、文本、符号、标签的宽度或大小
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("topleft", inset = .05, title = "Drug Type", c("A", "B"),
lty = c(1, 2), pch = c(15, 17), col = c("red", "blue"))
# 还原
par(opar)
# 3.4.5 文本标注
# 可以通过函数text()和mtext()将文本添加到图形上。text()可向绘图区域内部添加文本,而mtext()则向图形的四个边界之一添加文本。
# 使用格式分别为:
# text(location, "text to place", pos, ...)
# mtext("text to place", side, line = n, ...)
# 函数text()和mtext()的选项
# location:文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置
# pos:文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示
# side:指定用来放置文本的边。1=下,2=左,3=上,4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对齐
attach(mtcars)
plot(wt, mpg,
main = "Mileage vs Car Weight",
xlab = "Weight", ylab = "Mileage",
pch = 18, col = "blue")
# 针对数据框mtcars提供的32种车型的车重和每加仑汽油行驶英里数绘制了散点图。 函数text()被用来在各个数据点右侧添加车辆型号。各点的标签大小被缩小了40%,颜色为红色。
text(wt, mpg,
row.names(mtcars),
cex = 0.6, pos = 4, col = "red")
detach(mtcars)
# 例子二,以下是一段展示不同字体族的代码:
opar <- par(no.readonly = TRUE)
par(cex = 1.5)
plot(1:7, 1:7, type = "n")
text(3, 3, "Example of default text")
text(4, 4, family = "mono", "Example of mono-spaced text")
text(5, 5, family = "serif", "Example of serif text")
par(opar)
# 数学标注
# 函数plotmath()可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。
help("plotmath")
# 示例
x <- seq(-4, 4, len = 101)
y <- cbind(sin(x), cos(x))
matplot(x, y, type = "l", xaxt = "n",
main = expression(paste(plain(sin) * phi, " and ",
plain(cos) * phi)),
ylab = expression("sin" * phi, "cos" * phi), # only 1st is taken
xlab = expression(paste("Phase Angle ", phi)),
col.main = "blue")
axis(1, at = c(-pi, -pi/2, 0, pi/2, pi),
labels = expression(-pi, -pi/2, 0, pi/2, pi))
# 3.5 图形的组件
# 在R中使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形
# 可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为 nrows、列数为ncols的图形矩阵。另外,可以使用nfcol=c(nrows, ncols)按列填充矩阵。
# 以下代码创建了四幅图形并将其排布在两行两列中:
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow = c(2, 2))
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")
par(opar)
detach(mtcars)
# 第二个示例,3行1列排布3幅图形
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow = c(3, 1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)
# 函数layout()的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
# 在以下代码中,一幅图被置于第1行,另两幅图则被置于第2行:
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
# 为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数。其形式为:
# widths = 各列宽度值组成的一个向量
# heights = 各行高度值组成的一个向量
# 相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm()来指定。
# 在以下代码中,我们再次将一幅图形置于第1行,两幅图形置于第2行。但第1行中图形的 10 高度是第2行中图形高度的三分之一。除此之外,右下角图形的宽度是左下角图形宽度的四分之一
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths = c(3, 1), heights = c(1, 2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
# 图形布局的精细控制
# 可能有很多时候,你想通过排布或叠加若干图形来创建单幅的、有意义的图形,这需要有对 图形布局的精细控制能力。你可以使用图形参数fig=完成这个任务。
# 代码清单3-4通过在散点图 上添加两幅箱线图,创建了单幅的增强型图形
# 要理解这幅图的绘制原理,请试想完整的绘图区域:左下角坐标为(0,0),而右上角坐标为 (1,1)。图3-19是一幅示意图。参数fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。
# 第一个fig=将散点图设定为占据横向范围0~0.8,纵向范围0~0.8。上方的箱线图横向占据0~0.8,纵向0.55~1。右侧的箱线图横向占据0.65~1,纵向0~0.8。fig=默认会新建一幅图形,所 以在添加一幅图到一幅现有图形上时,请设定参数new=TRUE。
# 我将参数选择为0.55而不是0.8,这样上方的图形就不会和散点图拉得太远。类似地,我选择 了参数0.65以拉近右侧箱线图和散点图的距离。你需要不断尝试找到合适的位置参数。
opar <- par(no.readonly = TRUE)
# 设置散点图位置
par(fig = c(0, 0.8, 0, 0.8))
plot(mtcars$wt, mtcars$mpg,
xlab = "Miles Per Gallon",
ylab = "Car Weight")
# 在左上方添加箱图
par(fig = c(0, 0.8, 0.55, 1), new = TRUE)
boxplot(mtcars$wt, horizontal = TRUE, axes = FALSE)
# 在右上方添加箱图
par(fig = c(0.65, 1, 0, 0.8), new = TRUE)
boxplot(mtcars$mpg, axes = FALSE)
mtext("Enhanced Scatterplot", side = 3, outer = TRUE, line = -3)
par(opar)
以上是关于《R语言实战》第3章的主要内容,如果未能解决你的问题,请参考以下文章