直方图(Histogram)和密度图(Density Plot)都是用于可视化数据分布的工具,它们有助于理解数据的集中趋势、离散程度和异常值。下面是对这两种图形的详细介绍:
直方图(Histogram):
1. 定义:
直方图是一种统计图表,用矩形条表示数据分布的频率。每个矩形条的宽度表示数据的间隔,高度表示该间隔内数据的频率。
2. 组成要素:
- 横轴(X轴): 表示数据的范围或者分组。
- 纵轴(Y轴): 表示每个分组内数据的频数或频率。
3. 制作步骤:
- 将数据分组成若干区间,每个区间称为一个“箱子”(bin)。
- 统计每个箱子内数据的数量(频数)或相对频率。
- 绘制矩形条,横轴上的每个箱子对应一个矩形,矩形的高度表示频数或频率。
4. 用途:
- 揭示数据的分布情况,包括集中趋势和离散程度。
- 识别异常值。
- 比较不同组的数据分布。
密度图(Density Plot):
1. 定义:
密度图是通过平滑直方图而得到的一种图形,它通过核密度估计(Kernel Density Estimation,简称KDE)来估计数据的概率密度分布。
2. 组成要素:
- 曲线: 表示数据的概率密度。
- 面积: 区域下方的面积等于该区域内的概率。
3. 制作步骤:
- 对数据进行核密度估计,通过在每个数据点附近放置核并计算每个点的贡献,形成平滑的密度估计曲线。
- 曲线下方的面积总和等于1。
4. 用途:
- 提供了更平滑的数据分布估计,相较于直方图更连续。
- 更容易发现分布的形状和特征。
- 在直方图不足以提供详细信息的情况下,提供更精细的数据分布展示。
对比:
- 形式: 直方图是由一系列矩形组成的,而密度图是一条平滑的曲线。
- 平滑度: 密度图通过核密度估计,更平滑地显示数据分布。
- 面积: 直方图的面积等于数据点的数量,而密度图下方的面积等于1。
总体而言,选择使用直方图还是密度图取决于数据的性质以及观察者对数据分布平滑度的需求。密度图通常在需要更连续和平滑的数据分布估计时更为合适。
示例
直方图
library(ggplot2)
library(ggsci)
library(ggridges)
library(cowplot)
ggplot(diamonds, aes(x = price)) +
geom_histogram(aes(fill = cut), color = 'black',
position = 'dodge', bins = 20) +
theme_classic() +
scale_fill_npg() +
theme(legend.background = element_blank(),
legend.position = c(0.91, 0.8))
这段代码使用了ggplot2
包中的ggplot
函数,用于创建直方图(Histogram)来可视化钻石数据集(diamonds)中价格(price)的分布情况。
-
ggplot(diamonds, aes(x = price))
: 使用ggplot
函数创建一个图形对象,数据来源于钻石数据集(diamonds),aes(x = price)
指定横轴的变量为价格(price)。 -
geom_histogram(aes(fill = cut), color = 'black', position = 'dodge', bins = 20)
: 添加直方图层,其中-
aes(fill = cut)
: 将直方图按照钻石的切割质量(cut)进行分组,并使用不同颜色填充。 -
color = 'black'
: 设置直方图边框颜色为黑色。 -
position = 'dodge'
: 将不同切割质量的直方图条并排放置,而不是堆叠在一起。 -
bins = 20
: 将价格分为20个箱子,即20个直方条。
-
-
theme_classic()
: 使用theme_classic()
函数设置图形的主题为经典主题,即简化的白色背景主题。 -
scale_fill_npg()
: 使用scale_fill_npg()
函数设置填充颜色的调色板,可能是一个自定义的颜色规范。 -
theme(legend.background = element_blank(), legend.position = c(0.91, 0.8))
: 使用theme()
函数设置图例的外观,其中-
legend.background = element_blank()
: 将图例的背景设为空白,即去除图例背景。 -
legend.position = c(0.91, 0.8)
: 将图例放置在图形的右上角,横坐标占整个图形宽度的91%,纵坐标占整个图形高度的80%。
-
密度图
ggplot(diamonds, aes(price)) +
geom_density(alpha = 0.4, aes(color = cut)) +
xlim(c(0, 10000)) +
scale_fill_npg() +
theme_classic() +
theme(legend.background = element_blank(),
legend.position = c(0.91, 0.8))
这段代码使用了ggplot2
包中的ggplot
函数,用于创建密度图(Density Plot)来可视化钻石数据集(diamonds)中价格(price)的分布情况。
-
ggplot(diamonds, aes(price))
: 使用ggplot
函数创建一个图形对象,数据来源于钻石数据集(diamonds),aes(price)
指定横轴的变量为价格(price)。 -
geom_density(alpha = 0.4, aes(color = cut))
: 添加密度图层,其中-
alpha = 0.4
: 设置图层透明度为0.4,以便在有多个密度图重叠时更容易区分。 -
aes(color = cut)
: 将密度图按照钻石的切割质量(cut)进行分组,并使用不同颜色表示。
-
-
xlim(c(0, 10000))
: 限制横轴的范围在0到10000之间,这是通过xlim()
函数实现的。 -
scale_fill_npg()
: 这是一个可能存在的错误,因为scale_fill_npg()
是用于设置填充颜色的,而在这里应该使用scale_color_npg()
来设置线条颜色。代码中可能存在一个错误或者混淆,需要根据实际情况进行调整。 -
theme_classic()
: 使用theme_classic()
函数设置图形的主题为经典主题,即简化的白色背景主题。 -
theme(legend.background = element_blank(), legend.position = c(0.91, 0.8))
: 使用theme()
函数设置图例的外观,其中-
legend.background = element_blank()
: 将图例的背景设为空白,即去除图例背景。 -
legend.position = c(0.91, 0.8)
: 将图例放置在图形的右上角,横坐标占整个图形宽度的91%,纵坐标占整个图形高度的80%。
-
这段代码的目的是创建一个密度图,以展示钻石价格在不同切割质量下的概率密度分布情况。不同切割质量的密度曲线以不同颜色表示,通过设定透明度和限制横轴范围,提供了更清晰的图像呈现。

直方图加密度图
ggplot(diamonds, aes(x = price)) +
geom_histogram(aes(fill = cut, y = ..density..), color = 'black',
position = 'dodge', bins = 20) +
geom_density() +
theme_classic() +
scale_fill_npg() +
theme(legend.background = element_blank(),
legend.position = c(0.91, 0.8))
这段代码使用了ggplot2
包中的ggplot
函数,结合了直方图(Histogram)和密度图(Density Plot)来同时呈现钻石数据集(diamonds)中价格(price)的分布情况。
-
ggplot(diamonds, aes(x = price))
: 使用ggplot
函数创建一个图形对象,数据来源于钻石数据集(diamonds),aes(x = price)
指定横轴的变量为价格(price)。 -
geom_histogram(aes(fill = cut, y = ..density..), color = 'black', position = 'dodge', bins = 20)
: 添加直方图层,其中-
aes(fill = cut, y = ..density..)
: 将直方图按照钻石的切割质量(cut)进行分组,并使用不同颜色填充,同时使用y = ..density..
表示纵轴使用密度标尺。 -
color = 'black'
: 设置直方图边框颜色为黑色。 -
position = 'dodge'
: 将不同切割质量的直方图条并排放置,而不是堆叠在一起。 -
bins = 20
: 将价格分为20个箱子,即20个直方条。
-
-
geom_density()
: 添加密度图层,不使用额外的aes参数。这会在同一图形上叠加密度估计曲线。 -
theme_classic()
: 使用theme_classic()
函数设置图形的主题为经典主题,即简化的白色背景主题。 -
scale_fill_npg()
: 使用scale_fill_npg()
函数设置填充颜色的调色板,可能是一个自定义的颜色规范。 -
theme(legend.background = element_blank(), legend.position = c(0.91, 0.8))
: 使用theme()
函数设置图例的外观,其中-
legend.background = element_blank()
: 将图例的背景设为空白,即去除图例背景。 -
legend.position = c(0.91, 0.8)
: 将图例放置在图形的右上角,横坐标占整个图形宽度的91%,纵坐标占整个图形高度的80%。
-
这段代码的目的是在同一图形中展示价格的直方图和密度图。直方图使用不同颜色表示不同切割质量的钻石,并使用密度标尺,而密度图在同一图形上叠加显示。这样可以更全面地了解价格的分布情况,同时对比不同切割质量的分布。

网友评论