直方图与密度估计

条形图(barplot)反映分类变量的频数分布或者比例, 直方图(histogram)反映连续取值的数值变量的分布。 geom_histogram()作直方图, 可以自动选取合适的分组个数, 也可以人为指定分组个数。

ggplot2包中的midwest数据集包含了美国中西部的一些县的统计数据, 如面积(单位:平方英里)。 下面的程序对连续取值的数值型变量area作频数直方图, 自动确定分组个数:

p <- ggplot(data = midwest,
mapping = aes(x = area))
p + geom_histogram()

上面图形的纵坐标是频数(count),是每个组的频数。 geom_histogram()默认调用stat_bin()进行分组及频数统计。

直方图的形状比较依赖于分组数与分组起始点位置, 可以用bins参数控制分组数, 用binwidth参数控制分组宽度, 用center或者boundary参数控制组中心或者组边界对齐位置, 如:

p + geom_histogram(bins = 15)

可以利用fill映射将构成直方图的观测按照某个分类变量分组, 然后每个条形内部按照该分类变量的值分段染色, 段内各颜色的长度代表该条形所在组某一类的频数, 如:

midwest_sub <- midwest %>%
# 只取两个州的数据作图
filter(state %in% c("OH", "WI"))
p <- ggplot(data=midwest_sub,
mapping = aes(x = area, fill = state))
p + geom_histogram(bins = 10)

可见面积较小的县主要来自OH州, 面积较大的县主要来自WI州。

geom_density()可以对连续变量绘制密度估计曲线,如:

p <- ggplot(data = midwest,
mapping = aes(x = area))
p + geom_density()

# 制作每个州的各县的面积密度估计, 画在同一坐标系中
p <- ggplot(data = midwest,
mapping = aes(
x = area,
# 线条颜色
color = state,
# 线条下面积的填充色
fill = state))
# 透明度30%
p + geom_density(alpha = 0.3)

可以看出,IN与MI州各县的面积偏小。 WI州各县的面积较大。

p <- ggplot(data = midwest,
mapping = aes(
x = area,
color = state))
# 画线
# 借助于geom_line(stat = "density")改成仅有多条曲线:
p + geom_line(stat = "density")

geom_density()的纵轴是密度估计。 为了能够将直方图与密度估计画在同一坐标系中, 需要将直方图的纵轴也改为密度估计,如:

p <- ggplot(data = midwest,
mapping = aes(x = area))
# 注意.. ..的用法
p + geom_histogram(mapping = aes(y = ..density..), alpha = 0.6) +
# size表示曲线的线条粗细
geom_density(size = 1)