《R语言实战》学习记录:图形初阶
时间:2018-08-13(学习) 2018-08-05(记录)
教程:《R语言实战》
学习内容:第三章
R语言实战
第三章:图形初阶
1. dev函数
> x11() # 打开一个图形设备/图形窗口
> plot(2:4) # 第一个窗口的内容
> x11()
> plot(1:10) # 第二个窗口的内容
> x11()
> plot(rnorm(10)) #第三个窗口的内容
> dev.set(dev.prev()) # 打开当前图形窗口的前一个图形窗口
windows
3
> abline(0, 1) # through the 1:10 points
# 在当前图形窗口(第三个图形窗口)的前一个窗口(第二个窗口)上添加了一条线
> dev.set(dev.next()) # 打开当前图形窗口的下一个图形窗口
windows
4
> abline(h = 0, col = "gray") # for the residual plot
# 在当前图形窗口(第二个图形窗口)的下一个窗口(第三个窗口)上添加了一条灰色的过原点的水平线
> dev.set(dev.prev())
windows
3
> dev.set(dev.prev())
windows
2
> title("First")
# 在当前图形窗口(第三个图形窗口)的下下一个图形窗口(第一个图形窗口)上添加了标题“First”
> dev.off(); dev.off(); dev.off() #- close the three X devices
windows
3
windows
4
null device
1
2. 图形参数
生成本章练习所用数据:
> dose <- c(20, 30, 40, 45, 60)
> drugA <- c(16, 20, 27, 40, 60)
> drugB <- c(15, 18, 25, 31, 40)
使用par函数可以设置图形参数。
格式:*par(optionname = *value, optionname = name,…)
par():生成一个含有当前图形参数设置的列表。
par(no.readonly = TRUE):生成一个可以修改的当前图形参数列表。
使用plot函数进行绘图,该函数内指定的图形参数仅对生成的图形本身有效。
eg:
> plot(dose, drugA, type = "b")
> opar <- par(no.readonly = TRUE) # 复制了当前的图形参数设置
> par(lty = 2, pch = 17) # 设置线类型为2,点类型为17
> plot(dose, drugA, type = "b")
> par(opar) # 修改回默认的图形参数设置
# 指定绘图类型为b,点类型为2,线类型为10
> plot(dose, drugA, type = "b", lty = 2, pch = 10)
# 在上图的基础上,加上了线宽为默认宽度的2倍(lwd = 2),点的大小为默认大小的4倍(cex = 4)
> plot(dose, drugA, type = "b", lty = 2, lwd = 2, pch = 10, cex = 4)
下图左上、左下、右上、右下分别为上述代码生成的1-4幅图。
type | 内容 |
---|---|
p | 点 |
l | 线 |
b | 点和线(不连续) |
c | 不连续的线(在点处断开),相当于”b”去掉点 |
o | 线穿过点 |
h | 变量以点所在位置向x轴的垂直线的形式表示 |
s | 阶梯形1 |
S | 阶梯形2 |
n | 没有图 |
使用plot绘图可以选择绘图的颜色。
eg:
> n <- 10
> mycolors <- rainbow(n) # 选择彩虹色
> pie(rep(1, n), labels = mycolors, col = mycolors)
> mygrays <- gray(0:n/n)
> pie(rep(1, n), labels = mygrays, col = mygrays)
R中颜色可以使用颜色对应的R中的名称、RGB参数和颜色的16进制名称等来进行设置。
R中可以对字体进行设置。
- cex:相对于默认大小缩放倍数的数值
(参数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(等宽):TTCourier New
- serif(衬线):TT Times New Roman
- sans(无衬线):TT Arial
- 创建新的字体映射,windows系统使用函数windowsFonts(),Mac上为quartzFonts()。
eg:
> windowsFonts(
+ A = windowsFont("Arial Black"),
+ B = windowsFont("Bookman Old Style")
+ )
使用pin函数、mai函数和mar函数对图形的大小及边界进行性设置。
格式:pin = c(width, height):尺寸(英寸)
mai = c(下,左,上,右):边界(英寸)
mar = c(下,左,上,右):边界(英分)
eg:
> par(pin = c(2, 3)) # 宽为2英寸,高为3英寸
> par(lwd = 2, cex = 1.5) # 线宽为2倍,符号(点)大小为1.5倍
> par(cex.axis = .75, font.axis = 3) # 坐标轴字体大小为0.75倍,斜体
> plot(dose, drugA, type = "b", pch = 19, lty = 2, col = mycolors, fg = "yellow") # 参数fg设置前景色为黄色
> plot(dose, drugB, type = "b", pch = 23, lty = 6, col = "blue", bg = "green") # 参数bg设置背景色为绿色
在plot函数中添加参数main、sub、xlab和ylab可以为图形添加主标题,副标题以及x、y坐标轴的标签,参数xlim和ylim设置坐标轴范围。
eg:
> plot(dose, drugA,
+ main = "Clinical Trials for Drug A",
+ sub = "This is hypothetical data",
+ xlab = "Dosage", ylab = "Drug Response")
> plot(dose, drugA, type = "b",
+ col = "blue", lty = 2, pch = 2, lwd =.5,
+ font.main = 2, font.sub = 3, family = "serif",
+ cex.axis = .7, cex.lab = .7,
+ main = "Clinical Trials for Drug A",
+ sub = "This is hypothetical data",
+ xlab = "Dosage", ylab = "Drug Response",
+ xlim = c(10, 60), ylim = c(0,70))
3. 标题、坐标轴的添加
标题除了可以在plot函数中添加参数生成以外,还可以通过title函数为当前图形添加标题。
格式:title(main = “main-title”, sub = “sub-title”, xlab = “x-axis label”, ylab = “y-axis label”)
title() 中可指定其他图形参数,如cex、col等。
与标题类似,坐标轴也可以使用axis函数在生成图形后进行设置,axis函数一次仅生成一条坐标轴。
格式:axis(side, at = ,labels = ,pos = ,lty = , col = , las = ,tck = , …)
其中:
- side:在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右)
- at:需要绘制刻度线的位置
- labels:刻度线旁边的文字标签
- pos:与另一条坐标轴相交位置的值
- las = 0:坐标轴标签平行于坐标轴
- las = 2:坐标轴标签垂直于坐标轴
- tck = 刻度线的长度(相对于绘图区域大小的分数,默认值为0.01)
当tck > 0时在图形内侧, tck < 0:在图形外侧;当tck = 0时禁用刻度,当tck = 1时绘制网格线。
创建自定义坐标轴时,应当禁用高级绘图函数自动生成的坐标轴。
- 参数 axes=FALSE 将禁用全部坐标轴(添加参数frame.plot=TRUE时不禁用坐标轴框架线)。
- 参数 xaxt=”n” 和yaxt=”n” 分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。
eg:
> x <- 1:10
> y <- x
> z <- 10/x
> opar <- par(no.readonly = TRUE)
> par(mar = c(5, 4, 4, 8)+0.1)
> plot(x, y, type = "b",
+ pch = 21, col = "red",
+ yaxt = "n", lty = 3, ann = FALSE)
> 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 = .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)
plot函数中参ann:默认为TRUE。如果ann=FALSE,则生成图像不含任何名称。
4.次要刻度线和图例的添加
生成图像坐标轴除了含有主刻度线外,还可以使用Hmics包中的minor.tick函数为图像添加次要刻度线。
格式:minor.tick(nx = n, ny = y, tick.ratio = n)
其中,nx=n:将x轴的一格划分为n格;ny=m:将y轴的一格划分为m格;tick.ratio:次要刻度线相对于主刻度线的大小比例(长度相对于主刻度线的比例)。
par(“tck”):查看当前的主刻度线长度
使用abline函数为图像添加参考线。
格式:abline(h = yvalues, v = xvalues)
使用legend函数为图像添加图例(即图中各线条、符号所表示的数据内容)。
格式:legend(location, title, legend, …)
eg:
> par(opar)
> par(lwd = 2, cex = 1, 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, col = "blue", lty =2)
> abline(h = c(30), lwd = 1.5, lty = 2, col = "gray")
> library(Hmisc)
> minor.tick(nx = 2, ny = 2, tick.ratio = 0.5, x.args = list(lwd = .5, col = "gray"))
> legend("topleft", title = "Drug Type",
+ c("A","B"), lty = c(1,2), pch = c(15,17),
+ col = c("red","blue"), inset = .05)
> par(opar)
5.添加文本
使用text函数可以向绘图区域内部添加文本。可通过指定参数location为locator(1)使用鼠标交互式地确定摆放位置
格式:text(location, “text to place”, pos, …)
使用mtext函数可以向图形的四个边界之一添加文本。
格式:mtext(“text to place”, side, line = n, …)
eg:
> attach(mtcars)
> plot(wt, mpg,
+ main = "Mileage vs. Car Weight",
+ xlab = "Weight", ylab = "Mileage",
+ pch = 18, col = "blue")
> text(wt, mpg,
+ row.names(mtcars),
+ cex = .6, col = "red",
+ pos = 4, offset = .5)
> detach(mtcars)
> par(opar)
> par(cex = 1.5)
> plot(1:7, 1:7, type = "n")
> text(3,3, "default")
> text(4,4, family = "mono", "mono-spaced")
> text(5,5, family = "serif", "serif")
6.图形组合
通过更改par中参数mfrow或使用layout函数,可以对多个图像进行组合。
eg:
> with(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)
+ }
+ )
使用layout函数可以指定了所要组合的多个图形的所在位置。让图形的组合更为灵活。
eg:
> with(mtcars, {
+ layout(matrix(c(1,2,3,3), 2, 2, byrow = TRUE))
+ hist(wt)
+ hist(mpg)
+ hist(disp)
+ }
+ )
在layout函数中添加参数widths和heights,可以更精确地控制每幅图形的大小。参数widths控制每个图像之间宽度比例,参数heights控制每个图像之间高度比例。
eg:
> with(mtcars, {
+ layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE),
+ widths = c(3,1), heights = c(1,1.5))
+ hist(wt)
+ hist(mpg)
+ hist(disp)
+ })
使用图形参数fig可以对图形进行更精细的控制。一个图像中左下角为0点,右上角为1,fig函数设置接下来要生成的图像在整个图形中所占的比例,该参数内容为长度为4的向量,前两个值设置宽度,后两个值设置长度。
eg:
> with(mtcars, {
+ opar <- par(no.readonly = TRUE)
+ par(fig = c(0, 0.85, 0, 0.85))
+ plot(wt, mpg, xlab = "Miles Per Gallon", ylab = "Car Weight")
+ par(fig = c(0, 0.8, 0.5, 1), new = TRUE)
+ boxplot(wt, horizontal = TRUE, axes = FALSE)
+ par(fig = c(0.6, 1, 0, 0.8), new = TRUE)
+ boxplot(mpg, axes = FALSE)
+ mtext("Enhanced Scatterplot", side = 3, outer = TRUE, line = -3)
+ par(opar)
+ })
为了让图形更为紧凑,第二个图形的长度为0.5-1,而不是0.85-1,相应的,第三个图的宽度为0.6-1,而不是0.85-1。
上一篇: 《R语言实战》学习记录:基本数据管理
下一篇: R语言实战读书笔记1—语言介绍