ggplot geom_bar vs geom_histogram

20

在ggplot中,geom_bar和geom_histogram有什么区别(如果有的话)?它们似乎产生相同的图形并使用相同的参数。


4
如果你查看 ?geom_histogram,你会发现 "geom_histogram 是 geom_bar 和 stat_bin 的别名"。 - Didzis Elferts
作为一名数学家,直方图与条形图是不同的,尽管它们的名称往往会混淆。引用维基百科的话来说,“直方图由表格频率组成,显示为相邻的矩形,竖立在离散间隔(箱)上,其面积等于区间内观测值的频率。矩形的高度也等于区间的频率密度,即频率除以区间的宽度。直方图的总面积等于数据的数量。” 条形图没有这样的面积限制。 - Carl Witthoft
谢谢。虽然看起来geom_bar()也应用了stat_bin(),因为您可以访问像..count..和..density..这样的stat_bin变量。 - jamborta
3个回答

20
  • 条形图提供了分类数据的可视化呈现。例如:
    • 红色、黑色和棕色头发的人数
    • 查看geom_barhelp file。这些示例都是计数。
    • 维基百科page
  • 直方图用于绘制interval(通常是数字)数据的密度分布。例如,
    • 年龄和身高的分布
    • geom_histhelp file。这些示例是电影评分的分布。

ggplot2

经过进一步调查,我认为在ggplot2中的geom_bargeom_histogram之间没有区别。来自文档:

 geom_histogram(mapping = NULL, data = NULL, stat = "bin",
    position = "stack", ...)
 geom_bar(mapping = NULL, data = NULL, stat = "bin",
    position = "stack", ...)

我知道在geom_histogram的文档中已经说明了:

geom_histogramgeom_barstat_bin的别名。

但说实话,我并不确定这意味着什么,因为我对ggplot2的理解是stat_bingeom_bar都是图层(重点略有不同)。


我认为这在ggplot中的表现不准确,因为 ggplot(diamonds,aes(depth)) + geom_histogram(aes(y=..density..)) 和 ggplot(diamonds,aes(depth)) + geom_bar(aes(y=..density..)) 的结果是相同的图形(即直方图)。 - jamborta
密度图不是直方图。密度图不是百分比。密度图就是密度图。请参考https://dev59.com/0HTYa4cB1Zd3GeqPvHgN获取更多引用。 - russellpierce

3
默认情况下,geom_bar和geom_histogram的行为相同。这是因为(正如@csgillespie所提到的),在调用geom_histogarm时有一个隐含的stat_bin(可以理解),并且它也是应用于geom_bar的默认统计转换(在我看来是可争议的行为)。这就是为什么当您想要按原样绘制数据时,需要指定stat='identity'的原因。 stat='bin'stat_bin()是ggplot为您执行的一种统计变换。它将变量作为输出,并用两个点(..count....density..)括起来。如果您不指定stat='bin',则不会得到这些变量。

1

geom_bar() 适用于 x 和 y 值均为分类数据。因此,在 x 值是具有不同级别的因子时,两个 bar之间会有间隔。

geom_histogram() 适用于一个连续数据和一个分类数据。通常我们将连续数据放在 x 轴上(因此条形图彼此相接),分类数据放在 y 轴上。

还有另一种图表可以用来显示上述情况(1 个分类数据和 1 个连续数据)—— geom_boxplot()。通常我们使用 y 轴来表示连续数据,因为它将成为一个垂直的箱线图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接