如何在 0 和 1 之间标准化直方图的 Y 轴?

Posted

技术标签:

【中文标题】如何在 0 和 1 之间标准化直方图的 Y 轴?【英文标题】:How do I normalize the Y-axis of histogram between 0 and 1? 【发布时间】:2016-11-07 04:59:11 【问题描述】:

我需要将直方图的 Y 轴标准化为 0-1 之间。

这是我的 data.frame 的一部分:

1.8064 2.2016 2.4506 2.1828 2.1171 1.9308 2.1707 2.1885
2.2310 2.2400 1.9115 2.1527 2.0934 1.7989 2.2144 2.0091
1.9248 2.2038 1.9676 1.9224 1.9502 1.7990 2.0824 2.1300
2.0095 2.0341 1.8433 1.8361 1.9958 1.8243 2.0397 2.0482
2.1143 2.2627 1.7620 1.7561 1.9490 1.9803 1.9336 2.2511
2.2377 2.5414 1.7867 1.6618 2.5090 1.8325 2.0212 2.1616
2.3476 2.1878 2.0469 1.7508 2.2969 1.7939 2.0291 2.0721
2.3534 2.0932 2.3502 1.9960 2.0710 1.9923 1.7787 1.9772
2.2607 2.1504 2.3685 2.1148 2.1961 1.7738 1.8405 2.0135
2.2411 1.9916 2.4726 2.0347 2.0751 1.7570 1.8874 1.9385
2.1913 1.8981 2.2441 2.3068 2.1198 2.1484 1.8056 1.7747
2.0842 1.8750 2.3023 2.1204 1.8972 2.1534 1.8028 1.9401
2.2105 1.9618 2.2472 1.9656 2.3098 1.9771 1.9520 1.8627
2.2863 1.9959 2.1781 1.9544 1.9281 1.9286 1.9699 2.0330
2.1987 2.0583 2.0953 2.0206 2.1148 2.3789 1.7052 1.9145
2.0513 2.0850 1.9810 2.4943 1.9120 2.2209 1.9461 2.0882
2.0049 2.0416 1.9303 2.3681 1.8974 2.0054 1.9261 1.9097
1.6882 2.1196 1.8641 2.3600 2.0931 1.7641 2.1131 1.7748
1.8840 1.7604 1.7664 2.2000 2.0055 1.8229 1.9871 1.9168
1.7340 1.9656 1.8480 2.0523 1.9950 1.8716 1.9206 1.7786

这就是我目前正在做的事情:

for (i in data)
  x <- i

  h<-hist(x, plot = FALSE)
  h$density = h$counts/sum(h$counts)

  plot(h, col="red", xlim = c(0,max(data)))

但我得到了这张照片:

但我真正想要的是这样的(Y轴在0-1之间):

【问题讨论】:

使用 scale() 函数 (inside-r.org/r-doc/base/scale) @algui91 规模在哪里?。我不想缩放我的数据框,我想缩放频率。有没有办法做到这一点?我是 R 的新手 查看这个答案:***.com/questions/15215457/… @algui91 谢谢。我检查了,但我的疑问尚未解决。 如果我没记错的话,scale,虽然它的名字,在数据的 [-1,1] 之间进行标准化。它为您提供均值 0 和 sd = 1 的正态分布。这不是您想要的吗? 【参考方案1】:

要在 [0,1] 之间缩放 Y,您可以使用 flodel 在 this answer 中建议的内容

maxs <- apply(a, 2, max)
mins <- apply(a, 2, min)
scale(a, center = mins, scale = maxs - mins)

但修改该代码以仅使用您的 y 列:

maxs <- max(y)
mins <- min(y)
scale(y, center = mins, scale = maxs - mins)

希望对你有帮助

【讨论】:

【参考方案2】:

只需将每个观察值除以最大值即可将数据归一化为 1。

但问题仍然存在,为什么?如果 y 轴归一化为 0-1,则意味着概率,这显然不是。

【讨论】:

以上是关于如何在 0 和 1 之间标准化直方图的 Y 轴?的主要内容,如果未能解决你的问题,请参考以下文章

图像“黑色墨水量”的水平轴直方图

如何避免熊猫直方图子图中的绘图标题和轴标题之间的重叠? [复制]

如何在单个图形上标记多个图形的 x 和 y 轴 [重复]

如何调整树状图的y轴大小

Matplotlib/pyplot:如何强制执行轴范围?

在 Pandas 直方图中设置 y 轴限制