本节介绍R中基础的图形工具,即不需要安装和加载扩展包即可实现的图形工具。

本节使用R自带的数据mtcars

1 直方图

1.1 频数直方图

#频数直方图
hist(mtcars$mpg)

#查看mpg的最小值和最大值
min(mtcars$mpg)
[1] 10.4
max(mtcars$mpg)
[1] 33.9
#breaks=设置分组边界,第1组的下限要小于最小值,最后一组的上限要大于最大值。
#c()生成向量
hist(mtcars$mpg, ylim=c(0,15), xlim=c(10, 35),
     breaks=c(10,15,20,25,30,35),col=4)

#seq(起点,终点,步长)生成等差序列,作为各组的边界
hist(mtcars$mpg, prob=T, ylim=c(0,0.12), xlim=c(10, 35),
     breaks=seq(from=10, to=34, by=3),col=5)

#设定组数 breaks=num
#若R认为指定的组数的分组效果不佳,R会自动调整一个更适宜的组数。
#指定分10组,组距为2.4;分12组,组距为2,是整数,分组区间更加适宜阅读。
#R认为分12组更好,所以没有用“breaks= 10”. 
hist(mtcars$mpg, ylim=c(0,10), xlim=c(10,35),breaks=10,col=3)

#设定组数为5, breaks=5
hist(mtcars$mpg, ylim=c(0,10), xlim=c(10,35),breaks=5,col=2)

#指定分组边界 breaks=seq(起点,终点,步长)
hist(mtcars$mpg, ylim=c(0,10), xlim=c(10,35),
     breaks=seq(10,34,2.4),col=5)

#添加图形标题 main="",坐标轴标题 xlab="", ylab=""
hist(mtcars$mpg, ylim=c(0,8), xlim=c(10, 35),
     breaks=seq(10,34,3), main="Histogram of Mpg",
     xlab="Miles per Gallon", ylab="Frequency")

#坐标轴刻度水平放置 las=1
hist(mtcars$mpg, ylim=c(0,10), xlim=c(10, 35),
     breaks=seq(10,34,3), main="Histogram of Mpg",
     xlab="Miles per Gallon", ylab="Frequency", las=1,,col=3)

#设置直方图填充色
hist(mtcars$mpg,las=1,col=5)

hist(mtcars$mpg,las=1,col="deepskyblue")

#col=中设置三种颜色,循环出现
hist(mtcars$mpg,las=1,col=c(4,3,2))

1.2 频率直方图

#绘制频率直方图,纵轴代表概率,增加参数项prob=T
hist(mtcars$mpg, prob=T, ylim=c(0,0.12), xlim=c(10, 35),col=2)

#绘制频率直方图,增加参数项freq=FALSE 或者 prob=T
hist(mtcars$mpg, freq=FALSE, ylim=c(0,0.12),col=3)

hist(mtcars$mpg, freq=F, ylim=c(0,0.12),col=4)

hist(mtcars$mpg, prob=T,ylim = c(0,0.10),las=1,xlab = "MPG",col=5)

#在频率直方图上添加概率密度曲线
lines(density(mtcars$mpg),col=2,lwd=3)

1.3 分组直方图

par(mfrow=c(1,2))  #设置图形布局1行2列

hist(mtcars$mpg[mtcars$vs== 0],las=1,col=5,breaks = 5,
     xlab="v-shaped",main="Histogram of Mpg",
     xlim=c(10,35),ylim = c(0,12))

hist(mtcars$mpg[mtcars$vs== 1],las=1,col=5,
     xlab="straight",main="Histogram of Mpg",
      xlim=c(10,35),ylim = c(0,12))

#另一种写法

attach(mtcars) #锁定数据集

hist(mpg[vs== 0],las=1,col=5,breaks = 5,
     xlab="v-shaped",main="Histogram of Mpg",
     xlim=c(10,35),ylim = c(0,12))

table(cyl)
cyl
 4  6  8 
11  7 14 
par(mfrow=c(1,3))  #设置图形布局1行3列

hist(mpg[cyl==4],las=1,col=5,breaks = seq(10,35,5),
     xlab="4 cylinders",main="Histogram of Mpg",
     xlim=c(10,35),ylim = c(0,8))

hist(mpg[cyl==6],las=1,col=5,breaks = seq(10,35,5),
     xlab="6 cylinders",main="Histogram of Mpg",
     xlim=c(10,35),ylim = c(0,8))

hist(mpg[cyl==8],las=1,col=5,breaks = seq(10,35,5),
     xlab="8 cylinders",main="Histogram of Mpg",
     xlim=c(10,35),ylim = c(0,8))

2 箱线图

2.1 普通箱线图

#箱线图
boxplot(mpg,main="Boxplot of Mpg", las=1,col=4)

#满足vs==1条件的画箱线图
boxplot(mpg[vs==1],ylim=c(15,40),main="Boxplot of Mpg", las=1,col=5)

#满足vs==0条件的画箱线图
boxplot(mpg[vs==0],main="Boxplot of Mpg", las=1,col=4)

2.2 分组箱线图

#按am分组后,绘制分组箱线图
boxplot(mpg~am,main="Boxplot of Mpg", las=1,col=5)

#按vs,am分成四组后,绘制分组箱线图,设置箱体颜色,col=
boxplot(mpg~vs*am,las=2,col=c(6,5,4,3))

#legend()设置图例,"topleft"图例位置,legend=c()图例文本,fill=图例方格填充颜色,cex=图例大小缩放比例,bty = "n"图例无矩形框 
legend("topleft",legend=c("v-shaped & automatic","straight & automatic","v-shaped & manual","straight & manual"),
       fill = c(6,5,4,3),cex=0.8,bty = "n")

3 茎叶图

#注意茎叶图中报告的“the decimal point is ....”小数点的位置
stem(mpg)

  The decimal point is at the |

  10 | 44
  12 | 3
  14 | 3702258
  16 | 438
  18 | 17227
  20 | 00445
  22 | 88
  24 | 4
  26 | 03
  28 | 
  30 | 44
  32 | 49
sort(disp)
 [1]  71.1  75.7  78.7  79.0  95.1 108.0 120.1 120.3 121.0 140.8 145.0 146.7
[13] 160.0 160.0 167.6 167.6 225.0 258.0 275.8 275.8 275.8 301.0 304.0 318.0
[25] 350.0 351.0 360.0 360.0 400.0 440.0 460.0 472.0
stem(disp)

  The decimal point is 2 digit(s) to the right of the |

  0 | 7888
  1 | 012224
  1 | 556677
  2 | 3
  2 | 6888
  3 | 002
  3 | 5566
  4 | 04
  4 | 67

4 频数分布表

4.1 单个定性变量的频数分布

engine_freq <- table(vs)
engine_freq 
vs
 0  1 
18 14 

4.2 单个定性变量的百分比

engine_percent <- engine_freq/32
engine_percent
vs
     0      1 
0.5625 0.4375 

4.3 单个定量变量:单项式分组

#频数分布
carb_freq <- table(carb)
carb_freq
carb
 1  2  3  4  6  8 
 7 10  3 10  1  1 
#百分比
carb_percent <- prop.table(table(carb))*100
carb_percent
carb
     1      2      3      4      6      8 
21.875 31.250  9.375 31.250  3.125  3.125 

4.4 单个变量:组距式分组

range(mpg)
[1] 10.4 33.9
breaks=seq(10,35,5)
breaks
[1] 10 15 20 25 30 35
mpg.cut = cut(mpg, breaks, right=FALSE) #cut函数将数值映射到分组区间
mpg.cut
 [1] [20,25) [20,25) [20,25) [20,25) [15,20) [15,20) [10,15) [20,25) [20,25)
[10] [15,20) [15,20) [15,20) [15,20) [15,20) [10,15) [10,15) [10,15) [30,35)
[19] [30,35) [30,35) [20,25) [15,20) [15,20) [10,15) [15,20) [25,30) [25,30)
[28] [30,35) [15,20) [15,20) [15,20) [20,25)
Levels: [10,15) [15,20) [20,25) [25,30) [30,35)
mpg_freq <- table(mpg.cut)
mpg_freq
mpg.cut
[10,15) [15,20) [20,25) [25,30) [30,35) 
      5      13       8       2       4 

4.5 两个变量的列联表

tab1 <- table(vs,am)
tab1
   am
vs   0  1
  0 12  6
  1  7  7
#为列联表添加行合计和列合计
addmargins(tab1) 
     am
vs     0  1 Sum
  0   12  6  18
  1    7  7  14
  Sum 19 13  32
#将列联表的频数转换成百分数
addmargins(prop.table(tab1)*100) 
     am
vs          0       1     Sum
  0    37.500  18.750  56.250
  1    21.875  21.875  43.750
  Sum  59.375  40.625 100.000
table(vs, mpg.cut)
   mpg.cut
vs  [10,15) [15,20) [20,25) [25,30) [30,35)
  0       5      10       2       1       0
  1       0       3       6       1       4
table(vs, mpg.cut)
   mpg.cut
vs  [10,15) [15,20) [20,25) [25,30) [30,35)
  0       5      10       2       1       0
  1       0       3       6       1       4
addmargins(table(vs, mpg.cut))#列联表中显示行合计列合计
     mpg.cut
vs    [10,15) [15,20) [20,25) [25,30) [30,35) Sum
  0         5      10       2       1       0  18
  1         0       3       6       1       4  14
  Sum       5      13       8       2       4  32

5 条形图

5.1 普通条形图

#先制作出定性变量vs的频数分布表
tab_vs <- table(vs)

#查看vs的频数分布表
tab_vs
vs
 0  1 
18 14 
#绘制vs的条形图
barplot(tab_vs, ylim = c(0,20), col = c(3,5),
        xlab = "Engine:0 = V-shaped, 1 = Straight")

5.2 堆栈条形图

#legend.text = T,图例
# density = 线条密度,angle = 线条角度
# space = 条形间隙与条形宽度的比例
barplot(tab1,ylim=c(0,25),xlim=c(0,4),
        legend.text = T, 
        las=1, col=rainbow(2),
        density=20,angle=45,
        space = 0.3,
        main = "stacked barplot",cex.main = 2,
        ylab="frequency", xlab="transmission") 
#给图形添加矩形框
box()

#给图形添加图例,legend()函数,可进行更细致的设置
#x = "topright"设置位置,可用关键词"bottomright", "bottom", "bottomleft", "left", "topleft", "top", 
#"topright", "right" and "center"
#也可直接指定图例的坐标值
#legend = c("straight", "v-shaped") 图例文本
#fill = c(5,6) 图例小方块,设置颜色
#density=20, angle=45 填充线条及角度
#cex=2 图例大小倍数
#bty="n"图例周边没有矩形框

barplot(tab1,ylim=c(0,25),xlim=c(0,4),
                las=1, col=c(5,6),
        density=20,angle=45,
        space = 0.3,
        main = "stacked barplot",cex.main = 2,
        ylab="frequency", xlab="transmission") 

legend(x = "topright", 
       legend = c("straight", "v-shaped"),  # Legend texts
       fill = c(5,6),    # Line types
       density=20, angle=45,
       cex=1.2,
       bty="n")

5.3 分组条形图

#绘制分组条形图,beside = T不是堆栈的
#space=c(0.1,0.5) 0.1组内间隙,0.5组间间隙
tab1
   am
vs   0  1
  0 12  6
  1  7  7
barplot(tab1,ylim=c(0,20),xlim=c(0,8),
        legend.text = T,
        las=1, col=rainbow(2),
        density=25,
        angle=45,space=c(0.1,0.5),
        beside = T)

barplot(tab1,ylim=c(0,10),xlim=c(0,12),
        legend.text = T,
        las=1, col=rainbow(2),
        density=25,
        angle=45,space=c(0.1,0.5),
        beside = T,
        horiz = T)

5.4 帕累托图

cyl_freq <- sort(table(cyl),decreasing = T)
cyl_freq
cyl
 8  4  6 
14 11  7 
pareto <- barplot(cyl_freq,ylim = c(0,16),xlim = c(0,4),legend.text = T ,width = 0.5,col=c(3,4,5))
text(pareto, cyl_freq, pos=3,labels=cyl_freq) #添加频数标签
box()

6 饼图

#计算engine各个类别的频数
engine_num <- table(vs)

#计算vs各个类别的百分比
engine_percent <- table(vs)/sum(table(vs))*100

# 定义标签
label1 <- names(engine_percent)
label2 <- paste0(round(engine_percent,2),"%")
#绘制饼图
pie(engine_num,main = "Pie Chart of Engine Type",   col=c(4,5),labels=paste(paste(label1,label2)))

#设置扇区角度
pie(engine_num,main = "Pie Chart of Engine Type",
    init.angle=90,labels = c("V-shaped:18","Straight:14"))

7 散点图

7.1 普通散点图

#散点图
plot(disp,mpg,las=1,col=2)

#pch= 点的标记形状,可填数字或者文本
plot(disp,mpg,las=1,pch=2,col=4)

plot(disp,mpg,las=1,pch="@",col=5)

#为散点图添加回归线
#abline()为图形添加直线
#lm()拟合线性模型linear model
plot(disp,mpg,las=1,pch=2,xlab="displacement",ylab = "mpg")
abline(lm(mpg~disp),col=3,lwd=5,lty=2)


#text()在图形中添加文本
cor(mpg,disp) #计算相关系数,然后把相关系数的值标在图形中
[1] -0.8475514
text(200,25,label="r=-0.8476")

7.2 分组散点图

#对[vs==0]的观测单元画散点图
plot(disp[vs==0],mpg[vs==0],las=1,pch=2,col=2)
#在前述图形上添加[vs==1]的观测单元的散点
points(disp[vs==1],mpg[vs==1],pch=4,col=4)
#图例横坐标350,纵坐标25
#cex=1.2 图例缩放比例,大于1比默认值大,小于1比默认值小
legend(350,25, 
       legend = c("v-shaped", "straight"),
       pch=c(2,4),  
       col = c(2,4),
       cex=0.9,
       bty="n")

8 本章作业

8.1 随机数函数和直方图

绘制下列向量(序列)的直方图,为直方图填充你喜爱的颜色。

  1. 生成一个服从均匀分布的向量(序列),该向量包含1000个值。

  2. 生成一个服从标准正态分布的向量(序列),该向量包含1000个值。

  3. 生成一个服从均值为80,标准差为5的正态分布的向量(序列),该向量包含1000个值。

  4. 生成一个服从自由度为5的卡方分布的向量(序列),该向量包含1000个值 。

  5. 生成一个服从自由度为5的t分布的向量(序列),该向量包含1000个值。

  6. 生成一个服从F(5,10)分布的向量(序列),该向量包含1000个值。

提示:随机数函数

  • 正态分布 rnorm(n, mean=0, sd=1)

  • 均匀分布 runif(n, min=0, max=100)

  • T分布 rt()

  • 卡方分布 rchisq()

  • F分布 rf( )

8.2 mtcars的图表展示

数据集:mtcars

  1. 绘制qsec的直方图(纵轴代表频数),为直方图设置标题,为横轴纵轴设置合理的刻度范围,将组距设置为2, 为直方图设置你喜爱的颜色。

  2. 绘制qsec的频率直方图(纵轴代表频率),为横轴纵轴设置合理的刻度范围,在该图中添加一条概率密度曲线,为概率密度曲线设置你喜爱的颜色。

  3. 绘制wt的直方图(纵轴代表频数),为横轴纵轴设置合理的刻度范围,设置图形标题,为直方图设置你喜爱的颜色。

  4. 绘制vs的条形图,纵轴代表频数。

  5. 绘制am的条形图,条形水平放置。

  6. 绘制am的饼图。

  7. 绘制wt的箱线图。

  8. 将汽车分为手动挡和自动挡两组,绘制这两个组别wt的箱线图,并设置你喜爱的颜色。

  9. 将汽车分为手动挡和自动挡两组,绘制这两个组别qsec的箱线图,并设置你喜爱的颜色。