2.3 绘制条形图

问题

如何绘制条形图?

方法

要绘制条形图(见图2-5左图),可以使用barplot()函数,并向其传递两个向量作为参数,第一个向量用来设定条形的高度,第二个向量用来设定每个条形对应的标签(可选)。如果向量中的元素已被命名,则系统会自动使用元素的名字作为条形标签:

# 首先来看一下BOD数据
BOD
#> Time demand
#> 1 1 8.3
#> 2 2 10.3
#> 3 3 19.0
#> 4 4 16.0
#> 5 5 15.6
#> 6 7 19.8

barplot(BOD$demand, names.arg = BOD$Time)

有时候,“条形图”表示的是分组数据中各个元素的频数(见图2-5右图)。这种条形图跟直方图有些类似,不过,其用离散取值的x轴替代了直方图中连续取值的x轴。要计算向量中各个元素的频数,可以使用table()函数:

# 值为4的频数为11,值为6的频数为7,而值为8的频数为14
table(mtcars$cyl)

然后将该函数生成的频数表传给barplot()产生频数图:

# 生成频数图
barplot(table(mtcars$cyl))

图片 388

图2-5:使用基础绘图系统绘制的条形图(左图);向量元素的频数条形图(右图)

如果使用ggplot2,可以使用geom_col()绘制相似的图(见图2-6)。我们可以使用geom_col()画出变量的条形图。注意x为连续变量和离散变量时的区别:

library(ggplot2)

# 变量值的频数表。这里使用的是BOD数据框,时间(time)列对应x值,需求(demand)列对应y值
ggplot(BOD, aes(x = Time, y = demand)) + 
  geom_col()

# 将x转化为因子型变量,从而使系统将其视作离散值
ggplot(BOD, aes(x = factor(Time), y = demand)) +
  geom_col()

图片 387

图2-6:使用geom_col()绘制的连续变量x的变量值条形图(左图);将x变量转化为因子型变量后的结果(注意,横坐标上没有6这个类别)(右图)

ggplot2也可以用来绘制分组变量的频数条形图(见图2-7),只需要使用geom_bar()函数代替geom_col()。再提醒一次,注意连续x轴和离散x轴的差异。对于某些类型的数据,使用factor()函数将连续型x变量转化为离散变量可能更有效:

# 频数条形图。这里使用的是mtcars数据框,cyl列对应x,而y值则通过统计cyl各取值对应行的数量来计算
ggplot(mtcars, aes(x = cyl)) +
  geom_bar()

# 频数条形图
ggplot(mtcars, aes(x = factor(cyl))) +
  geom_bar()

图片 386

图2-7:使用geom_bar()绘制的连续变量x的频数条形图(左图);将x变量转化为因子型变量后的结果(右图)


 

图片 385 

在旧版ggplot2包中,建议使用geom_bar(stat ="identity")来创建变量值的条形图。而在ggplot2 2.2.0中,可以使用函数geom_col()来实现同样的效果。


 

另见

关于绘制条形图的更多详细内容,参见第3章。