欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《R语言实战》第三章代码

程序员文章站 2024-02-28 12:11:10
...
# 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)