前言

这不是基本图形的说明使用,例如常见的条形图,饼图,直方图等,此内容可以当作快速查阅手册。

条形图

简单条形图

条形图通过函数barplot()来实现,函数原型如下:

1
2
3
4
5
6
7
8
9
10
barplot(height, width = 1, space = NULL,
names.arg = NULL, legend.text = NULL, beside = FALSE,
horiz = FALSE, density = NULL, angle = 45,
col = NULL, border = par("fg"),
main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
axes = TRUE, axisnames = TRUE,
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)
  • height:接收一个向量参数,根据向量参数内容绘制图形
  • **horiz = TRUE**:设置为TRUE则图形会生成水平条形图
  • main:图形标题
  • xlab:X 轴标签
  • ylab:Y 轴标签

代码示例:

1
2
barplot(trees$Girth,horiz = TRUE,main = '这是标题',
xlab='这是X轴',ylab='这是Y轴')

运行效果:

image-20220512200201549

如果希望标签距离图表更近一些,可以通过额外设置mtext来增加外边框的文本标签,例如:

1
2
3
barplot(trees$Girth,horiz = TRUE,main = '这是标题',
,ylab='这是Y轴')
mtext('这是X轴',side=1,line = 2)

运行效果:

image-20220512202945242

如果需要绘制的变量是一个因子或者有序型因子,可以直接使用plot()绘制垂直条形图

堆砌条形图和分组条形图

如果传入的Height参数不是向量而是一个矩阵,则绘制的结果是堆砌条形图或者分组条形图堆砌条形图和分组条形图取决于参数beside=FALSE/TRUE如果为TRUE,则矩阵中的每一列表示一个分组,各列的值将并列而不是堆砌;如果为FALSE,则矩阵中的每一列都生成图中的一个条形,其高度取决于其值。

代码示例:

1
2
3
4
5
6
7
8
opar = par(no.readonly = TRUE)
# 将图形分割成一行两列
par(mfrow=c(1,2))
# 绘制堆砌条形图
barplot(matrix(1:20,4,5))
# 绘制分组条形图
barplot(matrix(1:20,4,5),beside = TRUE)
par(opar)

运行效果:

image-20220512204141414

均值条形图

可以将数据计算出各种平均值,中位值等结果生成相关条形图,代码示例:

1
2
3
barplot(c(summary(trees$Girth)),
names.arg = c('Min.','1st Qu.','Median','Mean','3rd Qu.','Max'),
las=2)

运行效果:

image-20220512212911555

关于文本显示不全问题,可以参考关于R以及Rstudio的相关问题,或者查看下面内容

条形图微调

随着条数的增多,标签可能会重叠或者消失,可以通过如下参数来调整:

  • cex.names:(数值型)小于 1 的数值表示缩小标签字体大小
  • names.arg:(向量)允许自定义标签内容
  • las=2:旋转字体朝向

棘状图

这是一种特殊的条形图,棘状图对堆砌图进行重缩放,使得每个条形的总值为 1 ,而每一段数据则以比例来呈现。棘状图可以通过vcd包中的spine()来绘制,代码示例:

注意:spine传递的参数必须是双向表,即table

1
2
3
4
# 棘状图
library(vcd)
a <- table(trees$Girth,trees$Height)
spine(a)

运行效果:

image-20220512215113129

饼图

饼图随处可见,可以通过函数pie来创建,其函数原型如下:

1
2
3
4
pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
density = NULL, angle = 45, col = NULL, border = NULL,
lty = NULL, main = NULL, ...)
  • x:(数值型)表示每个扇形所占的面积
  • labels:(向量/单体取决于X)表示每个扇形的标签

代码示例:

1
2
3
# 饼图
a <- c(1,2,3)
pie(a,labels = c('苹果','西瓜','橘子'))

运行效果:

image-20220512215613638

如果希望实现3D饼图的效果,则可以使用plotrix包中的pie3D()函数来实现,代码示例:

1
2
3
4
5
# 3D饼图
library(plotrix)
a <- c(1,2,2.2)
name <- c('苹果','西瓜','橘子')
pie3D(a,labels=name,explode = 0.1)
  • explode:表示饼的分离程度

运行效果:

image-20220513184517721

如上图,在不标注标签数值的情况下,我们的肉眼获取无法区分”西瓜”和”橘子”的大小区别,这个时候可以使用扇形图。它是通过plotrix包中的fan.plot()函数来实现的。代码示例:

1
2
3
4
5
# 3D饼图
library(plotrix)
a <- c(1,2,2.2)
name <- c('苹果','西瓜','橘子')
fan.plot(a,labels=name)

运行效果:

image-20220513190120549

直方图

直方图是一种类似于条形图的图,它通过将X轴的值连续起来,然后Y值显示其高度,通过函数hist()函数来创建,函数原型如下:

1
2
3
4
5
6
7
8
9
hist(x, breaks = "Sturges",
freq = NULL, probability = !freq,
include.lowest = TRUE, right = TRUE, fuzz = 1e-7,
density = NULL, angle = 45, col = "lightgray", border = NULL,
main = paste("Histogram of" , xname),
xlim = range(breaks), ylim = NULL,
xlab = xname, ylab,
axes = TRUE, plot = TRUE, labels = FALSE,
nclass = NULL, warn.unused = TRUE, ...)
  • x:数据值
  • freq:(布尔值)当值为FLASE表示根据概率密度而不是频数绘制图形
  • breaks:用于控制组的数量

在定义直方图中的单元时,默认将生成等距切分。代码示例:

1
2
3
4
5
6
7
8
9
# 直方图
par(mfrow=c(1,3))
# 普通直方图
hist(trees$Girth)
# 概率密度直方图
hist(trees$Girth,freq = FALSE)
# 添加密度曲线
hist(trees$Girth,freq = FALSE)
lines(density(trees$Girth))

运行效果:

image-20220513192146545
  • density(x):生成密度数据

核密度图

核密度图时用于估计随机变量密度概率的一种非参数方法,绘制核密度图的方法为:

1
plot(density(x))

代码示例:

1
2
3
4
5
6
7
8
9
# 核密度图
opar <- par(no.readonly = TRUE)
par(mfrow=c(1,2))
# 基本和密度图
plot(density(trees$Girth),main='核密度图')
# 颜色填充核密度图
plot(density(trees$Girth),main='核密度图')
polygon(density(trees$Girth),col = 'black')
par(opar)
  • polygon:绘制指定值下的多边形区域,可以理解为填充指定区域

运行效果:

image-20220513193651584

核密度可以通过分组来比较组间的差异,可以通过使用sm包中的sm.density.compare()来实现,具体方法和实现效果自行查询,此处不做说明。

箱线图

箱线图又称为盒须图,通过绘制连续型变量的五数总括,即最小值,下四分位数(第25百分位数),中位数(第50百分位数),上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布

通过函数boxplot来实现,函数原型如下:

1
2
3
4
5
boxplot(formula, data = NULL, ..., subset, na.action = NULL,
xlab = mklab(y_var = horizontal),
ylab = mklab(y_var =!horizontal),
add = FALSE, ann = !add, horizontal = FALSE,
drop = FALSE, sep = ".", lex.order = FALSE)

代码示例:

1
2
# 箱线图
boxplot(trees$Girth)

运行效果:

image-20220513195516930

可以通过boxplot.stats(x)来输出用于构建图形的统计量

并列箱线图

可以通过传入参数的时候传入如下格式的参数即可:

1
boxplot(并列数据1~并列数据2)

具体用法和实现效果自行查询,此处不做说明

小提琴图

有一种特殊的箱线图,它结合了核密度图,形成了新的图形即小提琴图。

可以通过vioplot包中的vioplot()函数来绘制,函数原型如下:

1
vioplot(x, use.cols = TRUE, ...)

代码示例:

1
2
3
# 小提琴图
library(vioplot)
vioplot(trees$Girth)

运行效果:

image-20220513200708708

关于小提琴图的更多说明,请自行查询

点图

点图顾名思义,在图中根据数据绘制大量的点,可以通过dotchart()函数来实现,其函数原型如下:

1
2
3
4
5
6
7
dotchart(x, labels = NULL, groups = NULL, gdata = NULL, offset = 1/8,
ann = par("ann"), xaxt = par("xaxt"), frame.plot = TRUE, log = "",
cex = par("cex"), pt.cex = cex,
pch = 21, gpch = 21, bg = par("bg"),
color = par("fg"), gcolor = par("fg"), lcolor = "gray",
xlim = range(x[is.finite(x)]),
main = NULL, xlab = NULL, ylab = NULL, ...)
  • labels:用来指点每个点的标签

代码示例:

1
2
# 点图
dotchart(trees$Girth)

运行效果:

image-20220513201323377

End

关于 R 的基本图形如上所示,其更多的自定义参数可以查询官方文档,或者自行网络查询。