14.5 直方图

如果你要研究一个连续变量的分布,直方图是最佳选择6。

6Dataviz的狂热粉丝常认为核密度图(kernel density plot)对于这种分布来说会有“更好”的表现形式。但缺点是每次向没学过统计的人展示时,得先花上15分钟解释什么是核密度图。

在下例中,我们将返回到obama_vs_mccain数据集,这次只研究奥巴马的得票比例分布。在base中可以使用hist函数绘制直方图,如图14-26 所示。与plot类似,它没有data参数,须把它置于with内:

  1. with(obama_vs_mccain, hist(Obama))

图像说明文字 图14-26:使用base系统绘制的直方图

直方图的区间间距数值默认由斯特奇斯(Sturges)算法进行计算。你可以实验着使用各种不同的子区间(bin)宽度,这样对分布的理解将更完整。这非常灵活,可以通过多种方式来实现:给hist传递一个数字来指定区间的数目,或一个区间边缘的向量,或用于计算区间数目的算法名称(除了默认的"sturges"之外,目前还支持"scott""fd"),或一个能计算前两个选项之一的函数。在下例中,其结果如图14-27至14-31所示,main参数创建了图中的主标题。这也同样适用于plot函数:

  1. with(obama_vs_mccain,
  2. hist(Obama, 4, main = "An exact number of bins")
  3. ) #图14-27

图像说明文字 图14-27:在base系统中为直方图指定一个确切数目的区间间距

  1. with(obama_vs_mccain,
  2. hist(Obama, seq.int(0, 100, 5), main = "A vector of bin edges")
  3. ) # 图14-28

图像说明文字 图14-28:在base系统中为直方图指定一个确切数目的区间间距

  1. with(obama_vs_mccain,
  2. hist(Obama, "FD", main = "The name of a method")
  3. ) # 图14-29

图像说明文字 图14-29:在base系统中使用算法名称为直方图指定区间间距

  1. with(obama_vs_mccain,
  2. hist(Obama, nclass.scott, main = "A function for the number of bins")
  3. ) # 图14-30

图像说明文字 图14-30:在base系统中使用返回区间数的函数为直方图指定区间间距

  1. binner <- function(x)
  2. {
  3. seq(min(x, na.rm = TRUE), max(x, na.rm = TRUE), length.out = 50)
  4. }
  5. with(obama_vs_mccain,
  6. hist(Obama, binner, main = "A function for the bin edges")
  7. ) # 图14-31

图像说明文字 图14-31:在base系统中使用返回区间边缘的函数为直方图指定区间间距

freq参数控制直方图是否显示计数或显示每个区间的概率密度。当且仅当区间是均匀分布时,它默认为TRUE。图14-32显示其输出:

  1. with(obama_vs_mccain, hist(Obama, freq = FALSE))

图像说明文字 图14-32:使用base系统绘制的概率密度直方图

lattice中的直方图与base的类似,不过它还使用了一个data参数,这个参数使它能更易于分割成多个面板,且能把绘图保存为变量。breaks参数与其在hist中的使用方式相同。图14-33和14-34显示了lattice直方图及其区间间距的规格:

  1. histogram(~ Obama, obama_vs_mccain)
  2. # 图14-33
  3. histogram(~ Obama, obama_vs_mccain, breaks = 10)
  4. # 图14-34

图像说明文字 图14-33:使用lattice系统绘制的直方图

图像说明文字 图14-34:在lattice系统中指定区间间距

lattice中的直方图能通过指定接收字符串"count""density""percent"type参数支持计数、概率密度和百分比y轴。图14-35显示了"percent"(百分比)的风格:

  1. histogram(~ Obama, obama_vs_mccain, type = "percent")

图像说明文字 图14-35:使用lattice系统绘制的按百分比缩放的直方图

ggplot2直方图是通过添加一个直方图的geom来创建的。其区间规格很简单:只需要传递一个数字宽度到geom_histogram即可。其原因是为了迫使你手动尝试不同的区间数,而不仅仅满足于于默认值。图14-36显示了其用法:

  1. ggplot(obama_vs_mccain, aes(Obama)) +
  2. geom_histogram(binwidth = 5)

图像说明文字 图14-36:使用ggplot2系统绘制的直方图

你可以通过传递特殊的名字..count....density..到y-aesthetic中来选择计数或密度。图14-37演示了使用density绘制的图形:

  1. ggplot(obama_vs_mccain, aes(Obama, ..density..)) +
  2. geom_histogram(binwidth = 5)

图像说明文字 图14-37:使用ggplot2系统绘制的概率密度直方图