R语言学习笔记(二)处理函数与基本图形绘制

    技术2022-07-11  92

    写在前面主要内容数学与统计函数数据的标准化概率函数 生成服从正态分布的伪随机数字符串处理函数应用于矩阵和数据框的函数图形绘制直方图的绘制(hist)核密度图的绘制箱线图经验分布图正态QQ图茎叶图 高水平作图函数与低水平作图函数高水平作图函数高水平绘图中的命令低水平作图函数

    写在前面

    最近学习R语言,知识点比较多,所以在此总结一下。这部分主要说下R语言的绘图以及一些处理函数,命令偏数学的多一些,毕竟R语言一开始就是为了统计设计的嘛。

    P.S. 由于我使用了R Markdown来写R程序,导致代码下面的两个"##"后面为命令运行结果。

    主要内容

    常见的数学函数以及统计函数;

    统计绘图函数(直方图、核密度图、箱线图、正态QQ图、茎叶图、经验分布图等)

    高水平绘图函数(plot、coplot、pairs、qqnorm、contour、persp等)

    高水平绘图命令(add, axes, log, type等)

    低水平绘图函数与参数设置

    数学与统计函数

    abs(-3) ## [1] 3 sqrt(9) ## [1] 3 ceiling(5/3) ## [1] 2 floor(5/3) ## [1] 1 round(4.55) ## [1] 5 log(exp(10)) ## [1] 10 sin(pi/2) ## [1] 1 cos(pi/2) ## [1] 6.123032e-17 x <- c(1,2,3,3) mean(x) # 等价于meanx <- sum(x)/length(x); meanx ## [1] 2.25 median(x) ## [1] 2.5 sd(x) ## [1] 0.9574271 var(x) ## [1] 0.9166667 min(x) ## [1] 1 max(x) ## [1] 3

    数据的标准化

    x <- c(1,3,5,4) scale(x) ## [,1] ## [1,] -1.317465 ## [2,] -0.146385 ## [3,] 1.024695 ## [4,] 0.439155 ## attr(,"scaled:center") ## [1] 3.25 ## attr(,"scaled:scale") ## [1] 1.707825

    概率函数

    x <- pretty(c(-3, 3), 30); x ## [1] -3.0 -2.8 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 ## [16] 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 ## [31] 3.0 y <- dnorm(x) plot(x, y) rnorm(50, mean = 20, sd = 8) [1] 11.233327 22.000808 10.066406 19.273047 21.771780 34.621389 21.706101 [8] 21.934236 19.608269 16.698233 13.597833 22.653223 20.194896 25.730459 [15] 10.912291 18.101390 12.456593 21.678788 7.763024 27.193593 24.136049 [22] 31.140113 22.691629 18.891392 18.009354 28.952892 8.203124 16.267587 [29] 21.039319 26.668597 15.264060 15.474431 28.440294 14.970583 26.289378 [36] 18.113167 11.175129 2.085909 26.948591 12.651352 17.815405 13.490284 [43] 21.128309 41.396762 32.838635 14.187705 29.128805 16.050802 14.680583 [50] 31.128813

    生成服从正态分布的伪随机数

    runif(5) ## [1] 0.6973212 0.8353123 0.1633793 0.7737247 0.3019795 # 设定随机数种子 set.seed(12)

    字符串处理函数

    # 统计字符串中的字符数 nchar("abcde") ## [1] 5 # 提取字符串(生成子字符串) substr("abcde", 3, 5) ## [1] "cde" # 字符串的查找 grep("a", c("a", "c", "b", "a")) ## [1] 1 4 # 字符串的替换 sub("a", "A", "abcde") ## [1] "Abcde" # 字符串的分割 strsplit("abcde", "c") ## [1] "ab" "de" strsplit("abcde", "") # 分隔为每一个字符 ## [1] "a" "b" "c" "d" "e" # 字符串的合并 paste("Today is", "Tuesday.") ## [1] "Today is Tuesday." # 大小写转换函数 toupper("abc") ## [1] "ABC" tolower("ABc") ## [1] "abc"

    应用于矩阵和数据框的函数

    b <- matrix(runif(12), nrow=3) # 处理矩阵的函数 log(b) # 对矩阵的每个元素取自然对数 ## [,1] [,2] [,3] [,4] ## [1,] -2.66843174 -1.311625 -1.7215713 -4.7885131 ## [2,] -0.20116780 -1.775799 -0.4436883 -0.9347165 ## [3,] -0.05909021 -3.384469 -3.7775907 -0.2059417 mean(b) # 对矩阵所有元素求平均 ## [1] 0.3633845 # apply函数(按维度)处理矩阵 apply(b, 1, mean) ## [1] 0.1314632 0.5053715 0.4533189 # lapply函数,对列表进行处理,得到列表每个成分的处理结果 x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE)) lapply(x, mean) # 里面的逻辑值TRUE默认为1,FALSE默认为0 ## $a ## [1] 5.5 ## ## $beta ## [1] 4.535125 ## ## $logic ## [1] 0.5

    图形绘制

    直方图的绘制(hist)

    用于表示频数的分布

    # 基本的直方图绘制 x <- mtcars$mpg; x ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 ## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 ## [31] 15.0 21.4 hist(x) # 参数的设置, breaks表示分成的组数,默认y轴表示频数 hist(x, breaks = 12, col = "red", xlab = "Miles Per Callon") # freq=F 设置y轴表示概率密度 hist(x, freq = F, breaks = 12, col = "green", xlab = "Miles Per Callon") # 轴须图绘制 rug(jitter(x)) # 添加噪声 lines(density(x), col = "red", lwd = 2) # 频率变化情况

    核密度图的绘制

    观察连续型变量的分布的工具 x轴展现的值,y轴表示值在所有数据中出现的密度(概率)情况

    x <- density(mtcars$mpg); x ## ## Call: ## density.default(x = mtcars$mpg) ## ## Data: mtcars$mpg (32 obs.); Bandwidth 'bw' = 2.477 ## ## x y ## Min. : 2.97 Min. :6.481e-05 ## 1st Qu.:12.56 1st Qu.:5.461e-03 ## Median :22.15 Median :1.926e-02 ## Mean :22.15 Mean :2.604e-02 ## 3rd Qu.:31.74 3rd Qu.:4.530e-02 ## Max. :41.33 Max. :6.795e-02 plot(x) attach(mtcars) library(sm) sm.density.compare(mpg, cyl, xlab = "Miles Per Gallon")

    箱线图

    boxplot(mtcars$mpg, main = "Box Plot", ylab = "Miles per gallon") boxplot(mpg~cyl, data=mtcars, main = "Box Plot", xlab = "Number of Cylinders", ylab = "Miles per gallon")

    经验分布图

    适合连续型分布的场合

    w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0); w ## [1] 75.0 64.0 47.4 66.9 62.2 62.2 58.7 63.5 66.6 64.0 57.0 69.0 56.9 50.0 72.0 # 五数总括,计算数据中的两个最值与三个分位数 fivenum(w) ## [1] 47.40 57.85 63.50 66.75 75.00 # 经验分布图的绘制 ecdf(w) # 计算由经验分布函数得到的数值型向量 ## Empirical CDF ## Call: ecdf(w) ## x[1:13] = 47.4, 50, 56.9, ..., 72, 75 plot(ecdf(w),verticals = TRUE, do.p = TRUE) x <- 44:78 lines(x, pnorm(x, mean(w), sd(w)))

    正态QQ图

    正态分布的分布函数的反函数,为0-1上的均匀分布

    w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0); w ## [1] 75.0 64.0 47.4 66.9 62.2 62.2 58.7 63.5 66.6 64.0 57.0 69.0 56.9 50.0 72.0 qqnorm(w) qqline(w)

    茎叶图

    x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86, 87, 89, 89, 89, 90, 91, 91, 92, 100); x ## [1] 25 45 50 54 55 61 64 68 72 75 75 78 79 81 83 84 84 84 85 ## [20] 86 86 86 87 89 89 89 90 91 91 92 100 stem(x) ## ## The decimal point is 1 digit(s) to the right of the | ## ## 2 | 5 ## 3 | ## 4 | 5 ## 5 | 045 ## 6 | 148 ## 7 | 25589 ## 8 | 1344456667999 ## 9 | 0112 ## 10 | 0

    高水平作图函数与低水平作图函数

    高水平作图函数有:plot(), coplot(), pairs(), qqnorm(), qqline(), hist(), contour()等,可以产生图形,定制参数; 而低水平作图函数自身无法生成图形,只能在高水平作图函数基础上增加新的图形。

    高水平作图函数

    plot()函数 绘制数据的散点图、曲线图等。

    有四种绘图方法:两向量的散点图、时间序列散点图(单向量关于下标的散点图复数向量的散点图)、因子的箱线图、不同指标构成的散点图(回归诊断图等)。

    x <- c(1,3,2,3,3,5); y <- c(3,2,3,4,5,6); z <- complex(re = x, im = y); plot(x) plot(x, y) plot(z) # 因子的箱线图 y<-c(1600, 1610, 1650, 1680, 1700, 1700, 1780, 1500, 1640, 1400, 1700, 1750, 1640, 1550, 1600, 1620, 1640, 1600, 1740, 1800, 1510, 1520, 1530, 1570, 1640, 1600) f<-factor(c(rep(1,7),rep(2,5), rep(3,8), rep(4,6))) plot(f,y) # 数据框的指标构成的散点图 df<-data.frame( Age=c(13, 13, 14, 12, 12, 15, 11, 15, 14, 14, 14, 15, 12, 13, 12, 16, 12, 11, 15 ), Height=c(56.5, 65.3, 64.3, 56.3, 59.8, 66.5, 51.3, 62.5, 62.8, 69.0, 63.5, 67.0, 57.3, 62.5, 59.0, 72.0, 64.8, 57.5, 66.5), Weight=c( 84.0, 98.0, 90.0, 77.0, 84.5, 112.0, 50.5, 112.5, 102.5, 112.5, 102.5, 133.0, 83.0, 84.0, 99.5, 150.0, 128.0, 85.0, 112.0)) plot(df) attach(df) # 身高与年龄指标的散点图 plot(~Age+Height) # 体重分别与年龄和身高的散点图 plot(Weight~Age+Height) 绘制多变量数据的函数

    pairs()函数,数据为矩阵或数据框时绘制矩阵关于其各列的散布图 coplot()函数,绘制更细致的散点图,也可以表示各列指标的关系

    # 与plot()函数的结果一致,为箱线图 pairs(df) # 绘制指标散点图,下面是按年龄划分的体重与身高的散点图 coplot(Weight ~ Height | Age) qqnorm(), hist(), dotchart(), contour(), image(), persp()等

    dotchart()函数绘制数据x的点图

    # Virginia州在1940年的人口死亡率点图 dotchart(VADeaths, main = "Death Rates in Virginia - 1940") dotchart(t(VADeaths), main = "Death Rates in Virginia - 1940")

    contour(), image(), persp()函数绘制山区的等高线图

    x <- seq(0,2800, 400); y <- seq(0,2400,400); z <- c(1180,1320,1450,1420,1400,1300,700,900, 1230,1390,1500,1500,1400,900,1100,1060, 1270,1500,1200,1100,1350,1450,1200,1150, 1370,1500,1200,1100,1550,1600,1550,1380, 1460,1500,1550,1600,1550,1600,1600,1600, 1450,1480,1500,1550,1510,1430,1300,1200, 1430,1450,1470,1320,1280,1200,1080,940) Z <- matrix(z, nrow = 8) # 绘制image图 image(x, y, Z) # 绘制等高线图 contour(x, y, Z, levels = seq(min(z), max(z), by = 50)) # 绘制3D曲面 persp(x, y, Z, theta=30, phi=45, expand=.3)

    高水平绘图中的命令

    图中的逻辑命令

    原图上添加新图:add=T, 默认为F,即直接替换原图 显示坐标轴:axes=F, 默认为T,即显示坐标轴

    contour(x, y, Z) contour(x, y, Z, levels = seq(min(z), max(z), by = 80), col=5, add=T) contour(x, y, Z, levels = seq(min(z), max(z), by = 50), axes=F) 数据取对数

    对x轴取对数:log="x" 对y轴取对数:log="y" 对x和y轴同时取对数:log="xy"

    x1 <- 1:10; x2 <- 4:13; plot(x1, x2, log="x") plot(x1, x2, log="xy", col=3) type命令 设定绘制散点图的参数 默认:type="p" 实线图:type="l" 点被实线连接(不穿过点):type="b" 实线穿过所有的点:type="o" 通过x轴作垂线:type="h" 绘制阶梯型曲线:type="s" 不绘制任何的点和曲线:type="n" x1 <- 1:10; x2 <- 4:13; plot(x1, x2, type = "s") 其他绘图时的命令

    pch:设定绘图时的符号 cex:设定符号的大小(相对于图形的大小, 数值表示) lty:设定线形 lwd:设定线宽 xlab(ylab):轴标题 main:主标题 sub:子标题

    x1 <- 1:10; x2 <- 4:13; plot(x1, x2, pch=12, cex=3, lty=2, lwd=2, col="red", xlab="x轴", ylab="y轴", main="直线", sub="小线")

    低水平作图函数

    points():加点 lines():连线 text():在图上的点处添加标记 abline():在图上加直线,abline(a, b)表示绘制 y = b x + a y=bx+a y=bx+a的直线,h=y和v=x分别表示平行于坐标轴的直线 title(main="", sub=""):在图上添加标记、说明或其他内容 axis(side):side的1、2、3、4表示下、左、上、右 legend(title, location):添加图例

    x <- 1:10; y <- 4:13; plot(x, y) xp <- c(8, 3, 4); yp <- c(9, 10, 5); points(xp, yp, pch=16, col="green") lines(xp, yp, pch=16, col="blue") text(x, y) abline(3,4) legend("topleft", inset = .01, "图例", c("A", "B"), lty=c(1, 2), pch=c(15, 17))
    Processed: 0.011, SQL: 9