14.5 直方图
如果你要研究一个连续变量的分布,直方图是最佳选择6。
6Dataviz的狂热粉丝常认为核密度图(kernel density plot)对于这种分布来说会有“更好”的表现形式。但缺点是每次向没学过统计的人展示时,得先花上15分钟解释什么是核密度图。
在下例中,我们将返回到obama_vs_mccain
数据集,这次只研究奥巴马的得票比例分布。在base
中可以使用hist
函数绘制直方图,如图14-26 所示。与plot
类似,它没有data
参数,须把它置于with
内:
with(obama_vs_mccain, hist(Obama))
图14-26:使用base系统绘制的直方图
直方图的区间间距数值默认由斯特奇斯(Sturges)算法进行计算。你可以实验着使用各种不同的子区间(bin)宽度,这样对分布的理解将更完整。这非常灵活,可以通过多种方式来实现:给hist
传递一个数字来指定区间的数目,或一个区间边缘的向量,或用于计算区间数目的算法名称(除了默认的"sturges"
之外,目前还支持"scott"
和"fd"
),或一个能计算前两个选项之一的函数。在下例中,其结果如图14-27至14-31所示,main
参数创建了图中的主标题。这也同样适用于plot
函数:
with(obama_vs_mccain,
hist(Obama, 4, main = "An exact number of bins")
) #图14-27
图14-27:在base系统中为直方图指定一个确切数目的区间间距
with(obama_vs_mccain,
hist(Obama, seq.int(0, 100, 5), main = "A vector of bin edges")
) # 图14-28
图14-28:在base系统中为直方图指定一个确切数目的区间间距
with(obama_vs_mccain,
hist(Obama, "FD", main = "The name of a method")
) # 图14-29
图14-29:在base系统中使用算法名称为直方图指定区间间距
with(obama_vs_mccain,
hist(Obama, nclass.scott, main = "A function for the number of bins")
) # 图14-30
图14-30:在base系统中使用返回区间数的函数为直方图指定区间间距
binner <- function(x)
{
seq(min(x, na.rm = TRUE), max(x, na.rm = TRUE), length.out = 50)
}
with(obama_vs_mccain,
hist(Obama, binner, main = "A function for the bin edges")
) # 图14-31
图14-31:在base系统中使用返回区间边缘的函数为直方图指定区间间距
freq
参数控制直方图是否显示计数或显示每个区间的概率密度。当且仅当区间是均匀分布时,它默认为TRUE
。图14-32显示其输出:
with(obama_vs_mccain, hist(Obama, freq = FALSE))
图14-32:使用base系统绘制的概率密度直方图
lattice
中的直方图与base
的类似,不过它还使用了一个data
参数,这个参数使它能更易于分割成多个面板,且能把绘图保存为变量。breaks
参数与其在hist
中的使用方式相同。图14-33和14-34显示了lattice
直方图及其区间间距的规格:
histogram(~ Obama, obama_vs_mccain)
# 图14-33
histogram(~ Obama, obama_vs_mccain, breaks = 10)
# 图14-34
图14-33:使用lattice系统绘制的直方图
图14-34:在lattice系统中指定区间间距
lattice
中的直方图能通过指定接收字符串"count"
、"density"
或"percent"
的type
参数支持计数、概率密度和百分比y轴。图14-35显示了"percent"
(百分比)的风格:
histogram(~ Obama, obama_vs_mccain, type = "percent")
图14-35:使用lattice系统绘制的按百分比缩放的直方图
ggplot2
直方图是通过添加一个直方图的geom
来创建的。其区间规格很简单:只需要传递一个数字宽度到geom_histogram
即可。其原因是为了迫使你手动尝试不同的区间数,而不仅仅满足于于默认值。图14-36显示了其用法:
ggplot(obama_vs_mccain, aes(Obama)) +
geom_histogram(binwidth = 5)
图14-36:使用ggplot2系统绘制的直方图
你可以通过传递特殊的名字..count..
或..density..
到y-aesthetic中来选择计数或密度。图14-37演示了使用density
绘制的图形:
ggplot(obama_vs_mccain, aes(Obama, ..density..)) +
geom_histogram(binwidth = 5)
图14-37:使用ggplot2系统绘制的概率密度直方图