首页 > 解决方案 > 我在低 X 值时没有得到正确的直方图

问题描述

我想制作一小组数字的直方图。我用了:

  1. 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8
  2. 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6
  3. 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6

我只得到 2) 的正确图 -- 对于 1) 和 3) 类别 2 和 3 的计数是正确的

> symm <- c(2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8) 

> hist(symm)

> posskew <- c(2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6)

> hist(posskew)

> negskew <- c(2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6)

> hist(negskew)

我希望在对称的 2 类别中得到一个频率为 1 的条形图。相反,对于 2 和 3 的类别,我的栏上升到 3(类似的情况发生在负偏态中)

标签: rhistogram

解决方案


直方图适用于连续数据。这些hist函数预计它将需要对数据进行分箱,并为计算分箱的算法提供了很多选项,您可以在?hist.

对于像您这样本质上是离散的数据,条形图更合适。这不会将值组合在一起。

par(mfrow = c(1, 3))
barplot(table(symm))
barplot(table(posskew))
barplot(table(negskew))

在此处输入图像描述

barplot本身可能会导致问题,因为您的数据实际上不是分类的。3和5之间的距离是有意义的,不管有没有4,这个意义都是一样的。如果没有任何 4,我上面显示的代码会将 3 放在 5 旁边。

problem = c(2, 3, 3, 5, 5, 5, 6, 6, 7)
barplot(table(problem))

在此处输入图像描述

一个修复方法是让它真正成为 categorical,转换factor并指定级别。

在此处输入图像描述

fix = factor(problem, levels = seq(min(problem), max(problem)))
barplot(table(fix))

另一个解决方法是强制hist使用你想要的休息时间。

hist(problem, breaks = seq(min(problem) - 1, max(problem)))

在此处输入图像描述

这种方法同样适用于您的示例。但是,请注意在这种情况下 x 轴标签的用处要少得多。hist仍在对数据进行分箱——每个条形图覆盖一个范围——我们刚刚强制每个分箱包含一个唯一值。但是左边的bar覆盖了从1到2的所有数据(2数据中的一个),下一个bar覆盖了大于2到33的所有数据(数据中的2s)等等。但是仅仅看直方图,你可能会想数据包括单个 1 和两个 2,而实际上不包含 1 和单个 2。

摘要:如果您的数据具有均匀间隔的值(缺少一些),并且您希望每个唯一值一个条形,那就barplot太好了。如果您的数据具有更多的唯一值,那么您需要条形图,那么您需要进行分类,hist这很好。


推荐阅读