r - 我在低 X 值时没有得到正确的直方图
问题描述
我想制作一小组数字的直方图。我用了:
- 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8
- 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6
- 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(类似的情况发生在负偏态中)
解决方案
直方图适用于连续数据。这些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
这很好。
推荐阅读
- amazon-web-services - API Gateway Websockets - 处理 10 分钟空闲连接超时
- ios - Swift:在串口监视器上接收来自服务器的 UDP 数据包,但不在 ios 应用程序中
- html - div不会填充父div
- excel - 按值除列
- sql - 我的程序有什么问题,我的程序中的数据有误
- c++ - 关于 linear_congruential_engine::min() 的问题
- c++ - 使用 xtensor 进行线性代数时未解决的外部符号错误
- javascript - 使用 Angular 导航到文档中的特定位置
- api - 没有足够的权限在 LinkedIn Learning API 中访问 /me GET
- visual-studio-code - 如何更改主题元素颜色?