在本教程中,我将带您使用 R 编程语言创建并自定义直方图。我们将介绍什么是直方图、如何准备数据、如何构建基础直方图,以及如何调整颜色、标签、箱数和坐标轴范围。
我们将只使用基础 R 语言,不依赖任何额外包。这种方式在无法使用额外包或需要进行快速探索性分析时尤其有用。在其他情况下,您可以考虑使用 ggplot2,详见我们的教程How to Make a ggplot2 Histogram in R。
要点速览
-
使用 hist(x) 在基础 R 中创建一个基本直方图,无需额外包
-
使用 col(填充色)、border(边框色)、main(标题)、xlab 和 ylab 自定义外观
-
使用 breaks 参数控制分箱:可传入数字、断点向量,或方法名("Sturges"、"Scott"、"Freedman-Diaconis")
-
使用 abline() 添加均值竖线,使用 lines(density()) 叠加密度曲线
-
对于分组或出版级别的直方图,请切换到 ggplot2
什么是直方图?
直方图是一种展示连续(数值)变量频率分布的图形。通过直方图,我们可以看到变量跨越的取值范围内,各区间内观测值的计数。
直方图与条形图外观相似。二者的关键区别在于,条形图对应特定类别或离散变量的数值,而直方图则用于可视化连续变量的频数。
为直方图准备数据
我们将使用这个住房数据集,其中包含不同房源的详细信息,包括房屋面积、房间数量、价格以及位置信息。我们可以使用 read.csv() 函数读取数据,可以直接从 URL 读取,或先将 csv 文件下载到目录后再从本地读取。我们也可以指定只保留本教程需要的列:price 和 condition。
home_data <- read.csv("https://raw.githubusercontent.com/rashida048/Datasets/master/home_data.csv")[ ,c('price', 'condition')]技术支持
使用 head() 函数查看数据的前几行。
head(home_data, 5)技术支持

使用基础 R 创建直方图
接下来,我们使用 hist() 函数创建一个直方图,查看数据集中价格的分布。
hist(home_data$price)技术支持

房价基础直方图。作者供图。
添加描述性统计
我们可以使用 abline() 函数为直方图添加描述性统计。这会在图中加入一条竖线。
hist(home_data$price)
abline(v = mean(home_data$price), col='red', lwd = 3)技术支持
绘制概率密度
要在直方图上添加概率密度线,首先需要将 y 轴改为密度尺度。在调用 hist() 时,将 probability 参数设为 TRUE。
概率密度线由 density() 与 lines() 配合完成:density() 计算概率密度曲线的位置,lines() 将其添加到现有图形上。
hist(home_data$price, probability = TRUE)
abline(v = mean(home_data$price), col='red', lwd = 3)
lines(density(home_data$price), col = 'green', lwd = 3)技术支持

带有均值标注的房价直方图。作者供图。
请注意,y 轴上的数值已经变化。
自定义颜色
hist() 的 col 参数设置柱体填充色,border 设置边框色。这里我将填充色设为蓝色,边框设为白色。
hist(home_data$price, col = 'blue', border = "white")技术支持
添加颜色的房价直方图。作者供图。
添加标签和标题
我们可以更改图中的标签,使其更易读、更易展示。如果您要与他人分享图表,这会很有帮助。
-
xlab 设置 x 轴标签
-
ylab 设置 y 轴标签
-
main 设置图表标题
hist(home_data$price, xlab = 'Price (USD)', ylab = 'Number of Listings', main = 'Distribution of House Prices')技术支持
带坐标轴标签的房价直方图。作者供图。
使用 breaks 分箱
在默认参数下,很难看清整个价格范围内房价分布的细节。我们能看到它们集中在前几个箱中,但信息不够丰富。
可以通过 breaks 参数增加箱数。该参数可以接受一个具体断点的向量、用于计算断点的函数、希望的断点数量,或用于计算箱数的函数。
在这个示例中,我们将传入希望的箱数。该数值应根据您希望在图中展示的内容而定,具有情境相关性。
hist(home_data$price, breaks = 100)技术支持
修改箱宽的房价直方图。作者供图。
当 breaks 设为 100 时,前几个区间的分布细节明显更清晰。
我们也可以通过传入常见的最优分箱计算方法名称来指定断点数量。默认情况下,hist() 使用 “Sturges” 方法。这里我们显式指定该方法。
hist(home_data$price, breaks = "Sturges")技术支持
使用 Sturges 方法的房价直方图。作者供图。
我们还可以为 breaks 属性传入 “Scott”,以使用 Scott 方法。
hist(home_data$price, breaks = "Scott")技术支持

使用 Scott 方法的房价直方图。作者供图。
最后,我们也可以使用 Freedman-Diaconis(FD)方法。
hist(home_data$price, breaks = "Freedman-Diaconis")技术支持
使用 Freedman-Diaconis 方法的房价直方图。作者供图。
比较分箱方法
下表总结了 hist() 中可用的三种命名分箱方法。默认使用 Sturges。
| 方法 | 工作原理 | 最佳适用场景 |
|---|
| Sturges | 箱数 = 1 + log₂(n)。假设数据近似正态。 | 小到中等规模、近似正态分布的数据集 |
| Scott | 箱宽 = 3.49 × sd × n⁻¹ᐟ³。最小化积分均方误差。 | 方差重要的正态分布数据 |
| Freedman-Diaconis | 箱宽 = 2 × IQR × n⁻¹ᐟ³。使用四分位距而非标准差。 | 偏态数据或含离群值的分布 |
设置坐标轴范围
我们可以使用 xlim 参数设置图中 x 轴范围,以便聚焦于我们感兴趣的数据。例如,与其查看整个图中较长的尾部,有时更有帮助的是关注分布的中心部分。
也可以更改 y 轴范围(使用 ylim 参数),但对于直方图而言,这通常意义不大,因为自动计算的取值几乎总是理想的。
我们将把价格缩放到 0 美元到 200 万美元之间。
hist(home_data$price, breaks = 100, xlim = c(0, 2000000))技术支持
更改坐标轴范围的房价直方图。作者供图。
直方图可视化的下一步
当您对 R 更加熟悉后,可以尝试专用的可视化包,它们在美观性、布局和交互性方面提供更多控制。R 中一款非常流行且易用的绘图库是 ggplot2。下面我们基于卧室数量,创建了一个关于价格分布的有趣视图。
使用 ggplot2 绘制的房价直方图。作者供图。
ggplot2 是 R 中使用最广泛的可视化包。您可以在我们的教程 How to Make a ggplot2 Histogram in R 中学习用它创建直方图,或查阅更广泛的入门教程 Graphics with ggplot2。想要更深入学习,请查看我们的 Introduction to ggplot2 course 和 Intermediate ggplot2 course。
总结
在本教程中,我们了解到直方图是用于观察连续变量分布的优秀可视化方式。我们学习了如何在 R 中制作直方图、如何在直方图上绘制汇总统计、如何自定义图表的各项要素(如坐标轴标题、颜色、x 轴分箱方式),以及如何设置坐标轴范围。最后,我们也展示了 ggplot2 库的一些强大功能。
想要继续阅读 DataCamp 的资料与资源,请查看我们的互动课程:
在本教程中,我将带您使用 R 编程语言创建并自定义直方图。我们将介绍什么是直方图、如何准备数据、如何构建基础直方图,以及如何调整颜色、标签、箱数和坐标轴范围。
我们将只使用基础 R 语言,不依赖任何额外包。这种方式在无法使用额外包或需要进行快速探索性分析时尤其有用。在其他情况下,您可以考虑使用
ggplot2,详见我们的教程How to Make a ggplot2 Histogram in R。要点速览
使用
hist(x)在基础 R 中创建一个基本直方图,无需额外包使用
col(填充色)、border(边框色)、main(标题)、xlab和ylab自定义外观使用
breaks参数控制分箱:可传入数字、断点向量,或方法名("Sturges"、"Scott"、"Freedman-Diaconis")使用
abline()添加均值竖线,使用lines(density())叠加密度曲线对于分组或出版级别的直方图,请切换到
ggplot2什么是直方图?
直方图是一种展示连续(数值)变量频率分布的图形。通过直方图,我们可以看到变量跨越的取值范围内,各区间内观测值的计数。
直方图与条形图外观相似。二者的关键区别在于,条形图对应特定类别或离散变量的数值,而直方图则用于可视化连续变量的频数。
为直方图准备数据
我们将使用这个住房数据集,其中包含不同房源的详细信息,包括房屋面积、房间数量、价格以及位置信息。我们可以使用
read.csv()函数读取数据,可以直接从 URL 读取,或先将 csv 文件下载到目录后再从本地读取。我们也可以指定只保留本教程需要的列:price 和 condition。使用
head()函数查看数据的前几行。使用基础 R 创建直方图
接下来,我们使用
hist()函数创建一个直方图,查看数据集中价格的分布。房价基础直方图。作者供图。
添加描述性统计
我们可以使用
abline()函数为直方图添加描述性统计。这会在图中加入一条竖线。将
v参数设为 x 轴上的位置以绘制竖线。此处我们用mean()计算房价均值。col参数设置线条颜色,这里为红色。lwd参数设置线宽。取值 3 可加粗线条,便于观察。绘制概率密度
要在直方图上添加概率密度线,首先需要将 y 轴改为密度尺度。在调用
hist()时,将probability参数设为TRUE。概率密度线由
density()与lines()配合完成:density()计算概率密度曲线的位置,lines()将其添加到现有图形上。带有均值标注的房价直方图。作者供图。
请注意,y 轴上的数值已经变化。
自定义颜色
hist()的col参数设置柱体填充色,border设置边框色。这里我将填充色设为蓝色,边框设为白色。添加标签和标题
我们可以更改图中的标签,使其更易读、更易展示。如果您要与他人分享图表,这会很有帮助。
xlab设置 x 轴标签ylab设置 y 轴标签main设置图表标题使用 breaks 分箱
在默认参数下,很难看清整个价格范围内房价分布的细节。我们能看到它们集中在前几个箱中,但信息不够丰富。
可以通过
breaks参数增加箱数。该参数可以接受一个具体断点的向量、用于计算断点的函数、希望的断点数量,或用于计算箱数的函数。在这个示例中,我们将传入希望的箱数。该数值应根据您希望在图中展示的内容而定,具有情境相关性。
当
breaks设为 100 时,前几个区间的分布细节明显更清晰。我们也可以通过传入常见的最优分箱计算方法名称来指定断点数量。默认情况下,
hist()使用“Sturges”方法。这里我们显式指定该方法。我们还可以为
breaks属性传入“Scott”,以使用 Scott 方法。使用 Scott 方法的房价直方图。作者供图。
最后,我们也可以使用 Freedman-Diaconis(FD)方法。
比较分箱方法
下表总结了
hist()中可用的三种命名分箱方法。默认使用 Sturges。设置坐标轴范围
我们可以使用
xlim参数设置图中 x 轴范围,以便聚焦于我们感兴趣的数据。例如,与其查看整个图中较长的尾部,有时更有帮助的是关注分布的中心部分。也可以更改 y 轴范围(使用
ylim参数),但对于直方图而言,这通常意义不大,因为自动计算的取值几乎总是理想的。我们将把价格缩放到 0 美元到 200 万美元之间。
直方图可视化的下一步
当您对 R 更加熟悉后,可以尝试专用的可视化包,它们在美观性、布局和交互性方面提供更多控制。R 中一款非常流行且易用的绘图库是 ggplot2。下面我们基于卧室数量,创建了一个关于价格分布的有趣视图。
ggplot2是 R 中使用最广泛的可视化包。您可以在我们的教程 How to Make a ggplot2 Histogram in R 中学习用它创建直方图,或查阅更广泛的入门教程 Graphics with ggplot2。想要更深入学习,请查看我们的 Introduction to ggplot2 course 和 Intermediate ggplot2 course。总结
在本教程中,我们了解到直方图是用于观察连续变量分布的优秀可视化方式。我们学习了如何在 R 中制作直方图、如何在直方图上绘制汇总统计、如何自定义图表的各项要素(如坐标轴标题、颜色、x 轴分箱方式),以及如何设置坐标轴范围。最后,我们也展示了
ggplot2库的一些强大功能。想要继续阅读 DataCamp 的资料与资源,请查看我们的互动课程: